OC第十天:內存管理⾼級

⼀、屬性的內部實現原理
⼀、assign
setter⽅法
@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name
{ _name = name; }

getter⽅法
- (NSString *)name
{ return _name; }


⼆、retain
setter⽅法
@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name)
{ [_name release];
_name = [name retain]; } }

getter⽅法
- (NSString *)name
{ return [[_name retain]autorelease]; }



三、copy
setter⽅法
@property(nonatomic,copy)NSString *name;
- (void)setName:(NSString *)name
{ if(_name != name)
{ [_name release];
_name = [name copy]; } }

getter⽅法
- (NSString *)name
{ return [[_name retain]autorelease]; }

// set get 方法都重寫系統將不在生成_name 只重寫一個系統會創建_name可以使用
      //[nil release];等於什麼都沒做
// 學了屬性和內存後不寫_name self.
        //這種賦值方式對於基本數據類型是安全的
        //對於對象類型賦值是不安全的 應該用set方法進行賦值保證內存安全

⼆、dealloc內釋放實例變量
dealloc是NSObject的⼀個實例⽅法,與alloc對應,⽤於回收開闢的內 存空間
這個⽅法在對象引⽤計數爲0時,由系統⾃動調⽤
通常我們在dealloc中釋放類的實例變量
- (void)dealloc{
[_name release];//釋放
setter⽅法泄露的實例變量
[super dealloc]; }

永遠不要⼿動調⽤dealloc. 在dealloc⽅法的最後⼀⾏,必須要寫[super dealloc];







三、便利構造器⽅法的實現原理

Person.m中
+ (id)personWithName:(NSString *)name
{ Person *p =[ [Person alloc] initWithName:name];
 return [p autorelease];
}







四、collection的內存管理
collection就是NSArray,NSDictionary,NSSet…等容器類
collection會⾃主管理⾃⼰內部的元素
加⼊collection中的對象會被retain
移除出collection的對象會被release
collection被釋放會對內部所有對象release


五 多態
⾯向對象的三⼤特性之⼀。
不同類型對象在響應同⼀個⽅法時的不同實現。
⽗類指針可以指向⼦類對象。
多態的特點
⽗類指針可以指向不同的⼦類對象
允許在多個類中定義同⼀個消息接⼝。
可以屏蔽不同⼦類對象之間的差異,寫出通⽤代碼。
適應需求的不斷變化
// 多態的真諦
        // 父類指針指向子類對象
總結
assign、retain、copy對應不同的setter實現。爲實例變量賦值 時,儘量使⽤setter⽅法,再次賦值時,會把之前值release。
dealloc在對象引⽤計數爲0時⾃動調⽤,不要顯⽰調⽤。
dealloc 實現體內,先要釋放實例變量,然後執⾏[super dealloc];
便利構造器的內存管理是藉助autorelease實現的。
集合會管理⾃⼰的元素。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章