10、內存管理⾼級

屬性的內部實現原理

assign

@property(nonatomic,assign)NSString *name;

等價於

//setter
- (void)setName:(NSString *)name{
    _name = name;
}
//getter
- (NSString *)name{
    return _name;
}

會出現的問題:野指針異常

//main.m文件
NSString *name = [[NSString alloc] initWithFormat:@"張三"];//此處開闢了一個name空間
Person *p = [[Person alloc]init];//開闢了一個指針空間
[p setName:name];//把指針指向name
[name release];//釋放name
NSLog(@”%@”,[p name]);//此處野指針異常
[p release];

retain

@property(nonatomic,retain)NSString *name;

等價於

//setter
- (void)setName:(NSString *)name{
    if(_name != name){
         [_name release];
         _name = [name retain];
     } 
}
//getter
- (NSString *)name{
    return [[_name retain]autorelease];
}

內部實現

//main.h
NSString *name = [[NSString alloc] initWithFormat:@"張三"];//此處開闢了一個name空間
Person *p = [[Person alloc]init];//開闢了一個指針空間
[p setName:name];//把指針指向name
[name release];//釋放name
NSLog(@”%@”,[p name]);
NSString *newName = [[NSString alloc]initWithFormat:@”李四”];//此處開闢了一個newName空間
[p setName:newName];//把指針指向newName
[newName release];//釋放newName
NSLog(@”%@”,[p name]);
[p release];

copy

@property(nonatomic,copy)NSString *name;

等價於

//setter
- (void)setName:(NSString *)name{
    if(_name != name){
         [_name release];
         _name = [name copy];
     } 
}
//getter
- (NSString *)name{
    return [[_name retain]autorelease];
}

dealloc內釋放實例變量

dealloc是NSObject的⼀個實例⽅法,與alloc對應,⽤於回收開闢的內存空間
這個⽅法在對象引⽤計數爲0時,由系統⾃動調⽤
通常我們在dealloc中釋放類的實例變量

delloc使用方法

Person.m中

- (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;
}

return [p autorelease]是最完美的解決⽅案,既不會內泄露,也不會產⽣野指針


collection的內存管理

collection就是NSArray,NSDictionary,NSSet…等容器類
collection會⾃主管理⾃⼰內部的元素

自主管理

加⼊collection中的對象會被retain
移除出collection的對象會被release
collection被釋放會對內部所有對象release

多態

⾯向對象的三⼤特性之⼀。
不同類型對象在響應同⼀個⽅法時的不同實現。
⽗類指針可以指向⼦類對象。

特點

⽗類指針可以指向不同的⼦類對象
允許在多個類中定義同⼀個消息接⼝。
可以屏蔽不同⼦類對象之間的差異,寫出通⽤代碼。
適應需求的不斷變化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章