您好,登錄后才能下訂單哦!
屬性的內(nèi)部實現(xiàn)原理
dealloc內(nèi)釋放實例變量
便利構(gòu)造器方法的實現(xiàn)原理
collection的內(nèi)存管理
屬性的語義特性及使用范圍。assign retain copy
assign下的屬性內(nèi)部實現(xiàn)
setter方法 | getter方法 |
@property(nonatomic , assign)NSString *name; - (void)setName:(NSString *)name { _name = name; } | - (NSString *)name { return _name; } |
main.m中.
NSString *name = [[NSString alloc] intwithFormat:@“張三]”;
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@“%@“, [p name]); <——————這里因為上面[name release];了,造成野指針異常
[p release]
retain下的屬性內(nèi)部實現(xiàn)
setter方法 | getter方法 |
@property(nonatomic , assign)NSString *name; - (void)setName:(NSString *)name { if(_name != name){ [_name release]; _name = [name retain]; } } | - (NSString *)name { return [[_name retain] autorelease]; } |
main.m中.
NSString *name = [[NSString alloc] intwithFormat:@“張三]”;
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@“%@“, [p name]);
NSString *newName = [[NSString alloc] initWithFormat:@“李四”];
[p setName:newName];
[newName release];
NSLog(@“%@“, [p name]);
[p release]
copy下的屬性內(nèi)部實現(xiàn)
setter方法 | getter方法 |
@property(nonatomic , assign)NSString *name; - (void)setName:(NSString *)name { if(_name != name){ [_name release]; _name = [name copy]; } } | - (NSString *)name { return [[_name retain] autorelease]; } |
main.m中.
NSString *name = [[NSString alloc] intwithFormat:@“張三]”;
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@“%@“, [p name]);
NSString *newName = [[NSString alloc] initWithFormat:@“李四”];
[p setName:newName];
[newName release];
NSLog(@“%@“, [p name]);
[p release]
//疑問?始終有一塊內(nèi)存沒有釋放掉。。。。。。。
dealloc
dealloc是NSObject的一個實例方法,與alloc對應(yīng)用與回收開辟的內(nèi)存空間
這個方法在對象引用計數(shù)為0時,由系統(tǒng)自動調(diào)用
通常我們在dealloc中釋放類的實例變量
Person.m中
- (void)dealloc{
[_name release]; //釋放setter方法泄漏的內(nèi)存,,,完美解決類上面的疑問。。
[super dealloc];
}
dealloc的注意事項
永遠(yuǎn)不要手動調(diào)用dealloc
在dealloc方法的最后一行,必須要寫[super dealloc];
構(gòu)造便利器的內(nèi)存管理
------->在便利構(gòu)造器的時候只有alloc開辟空間,可是沒有釋放,怎么辦呢 ??
Person.m中
+ (instancetype)personWithName:(NSString *)name{
Person *p = [[Person alloc] initWithName:name];
return [p autorelease];
}
或者
+ (instancetype)personWithName:(NSString *)name{
return [[Person alloc] initWithName:name] autorelease];
}
collection
collection就是NSArray, NSDictionary, NSSet,,,,等容器類
collection會自主管理自己內(nèi)部元素
加入collection中的對象會被retain
移除出collection的對象會被release
collection被釋放會對內(nèi)部所有對象release
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。