OC中內存管理 assign, retain, copy 的 setter 和 getter 方法

最近關於 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 方法.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章