内存管理高级知识点
屬性的內(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對應用與回收開辟的內(nèi)存空間
這個方法在對象引用計數(shù)為0時,由系統(tǒng)自動調(diào)用
通常我們在dealloc中釋放類的實例變量
Person.m中
- (void)dealloc{
? ? ? ?[_name release]; ?//釋放setter方法泄漏的內(nèi)存,,,完美解決類上面的疑問。。
? ? ? ?[super dealloc];
}
dealloc的注意事項
永遠不要手動調(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?
轉(zhuǎn)載于:https://blog.51cto.com/liuyafang/1545350
總結(jié)
- 上一篇: NBA中国与蚂蚁集团开启全面战略合作:支
- 下一篇: html 制作复杂table