最近關于 setter 和 getter 方法突然有些暈, 是以重新做了整理
記憶體管理 assign, retain, copy 的 setter 和 getter 方法
assign的 setter 和 getter 方法(用來定義簡單資料類型)
@property (nonatomic, assign) NSString *name;
1. assign 的 setter 方法
- (void)setName:(NSString *)name {
_name = name;
}
2. assign 的 getter 方法
- (NSString *)name {
return _name;
}
retain的 setter 和 getter 方法( 一般用來定義有資料結構的類對象)
@property (nonatomic, retain) NSString *name;
1. retain 的 setter 方法
- (void)setName:(NSString *)name {
if (_name != name) {
//如果_name 原本指向的記憶體空間和 name 的記憶體空間不相同時, 在這裡重新設定 _name 屬性的值時, 需要将原來的空間釋放掉, 再重新指向name 的記憶體空間.
[_name release];
_name = [name retain];
}
}
2. retain 的 getter 方法
- (NSString *)name {
return [[_name retain] autorelease];//getter 方法不會引起引用計數加 1
}
copy的 setter 和 getter 方法(一般用來設定 NSString)
@property (nonatomic, copy) NSString *name;
1. copy 的 setter 方法
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];//copy和 retain 的不同之處在于, copy 另外開辟一塊空間, 而 retain 是在name 的記憶體空間上引用計數加 1
}
}
2. copy 的 getter 方法
- (NSString *)name {
return [[_name retain] autorelease];
}
dealloc方法的作用
為了解決在類對象釋放時, 殘留的類對象屬性變量的記憶體空間沒有被釋放的問題, 是以在 dealloc 方法中需要先釋放屬性變量的記憶體空間.
在 ARC 中, 有系統對記憶體進行管理, 不用寫 dealloc 方法.