標籤:objective-c ios 記憶體管理
一、屬性的內部實現原理
assign的屬性內部實現
setter方法:
// setter方法@property (nonatomic, assign) NSString *name;- (void)setName:(NSString *)name{ _name = name;}
getter方法:
// getter方法- (NSString *)name{ return _name;}
觀察下面代碼會出現什麼問題?
NSString *name = [[NSString alloc] initWithFormat:@”張三”];Person *p = [[Person alloc] init];[p setName:name];[name release];NSLog(@”%@”, [p name]); // 如果物件類型使用assign之後,會出現野指標異常[p release];
retain的屬性內部實現
setter方法:
// setter方法@property (nonatomic, retain) NSString *name;- (void)setName:(NSString *)name{ if(_name != name) { [_name release]; _name = [name retain]; }}
getter方法:
// getter方法- (NSString *)name{ return [[_name retain] autorelease];}
copy的屬性內部實現
setter方法:
// setter?法@property (nonatomic, copy) NSString *name;- (void)setName:(NSString *)name{ if(_name != name) { [_name release]; _name = [name copy]; }}
getter方法:
// getter方法- (NSString *)name{ return [[_name retain] autorelease];}
二、dealloc內釋放執行個體變數
dealloc是NSObject的?個執行個體方法,與alloc對應,用於回收開闢的記憶體空間。這個?法在對象引用計數為0時,由系統自動調用通常我們在dealloc中釋放類的執行個體變數。
dealloc使用
以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 autorelease];}
return [p autorelease];
是最完美的解決?案,既不會記憶體泄露,也不會產?野指標。
四、collection的記憶體管理
collection就是NSArray,NSDictionary,NSSet…等容器類,collection會自主管理?己內部的元素。
collection記憶體的?主管理,加入collection中的對象會被retain,移除出collection的對象會被release,collection被釋放會對內部所有對象release。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C學習筆記_記憶體管理(二)