屬性的內部實現原理
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
多態
⾯向對象的三⼤特性之⼀。
不同類型對象在響應同⼀個⽅法時的不同實現。
⽗類指針可以指向⼦類對象。
特點
⽗類指針可以指向不同的⼦類對象
允許在多個類中定義同⼀個消息接⼝。
可以屏蔽不同⼦類對象之間的差異,寫出通⽤代碼。
適應需求的不斷變化