天天看點

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 方法.

繼續閱讀