在類中定義成員變量和Property屬性,是為了可以方便的在類的作用域內(nèi)引用變量
成員變量
@interface View1 ()
{
UILabel *_label;
}
首先明確一點(diǎn),對成員變量進(jìn)行賦值操作并不會令變量的引用計(jì)數(shù)增加
Property屬性
@property (retain, nonatomic) UILabel *label;
對于Property屬性,如果使用self.label = [[UILabel alloc] init];
這樣的方式進(jìn)行賦值,其實(shí)使用調(diào)用編譯器生成的setter方法,會令引用計(jì)數(shù)增加1,聲明self對Property屬性的所有權(quán)
自定義setter方法的時(shí)候通常會這樣寫
- (void)setLabel:(UILabel *)label {
if (_label != label) {
[_label release];
_label = [label retain];
}
}
所以使用了setter方法的時(shí)候,一定要在dealloc中對Property屬性釋放
addSubview
使用成員變量
addSubview方法會導(dǎo)致引用計(jì)數(shù)+1
UILabel *theLabel = [[UILabel alloc] init];// theLabel的retainCount = 1
[self.view addSubview:theLabel];// theLabel的retainCount = 2, 父視圖retain一次theLabel,父視圖對theLabel有所有權(quán)
_label = theLabel;// theLabel的retainCount = 2
[theLabel release];// theLabel的retainCount = 1,release操作,對應(yīng)alloc,現(xiàn)在只有父視圖對theLabel有所有權(quán)
上述代碼在MRC的工程中是非常常見的一種寫法, 因?yàn)槲覍?code>theLabel的alloc
操作已經(jīng)release
了,符合黃金法則。成員變量_label
只是指向theLabel
的指針而已。所以對于_label
來說不需要再進(jìn)行release
操作了。
使用Property屬性
UILabel *theLabel = [[UILabel alloc] init];// theLabel的retainCount = 1
[self.view addSubview:theLabel];// theLabel的retainCount = 2, 父視圖retain一次theLabel,父視圖對theLabel有所有權(quán)
self.label = theLabel;//theLabel的retainCount = 3, 調(diào)用setter方法,retainCount+1,
[theLabel release];//theLabel的retainCount = 2,release操作,對應(yīng)alloc,現(xiàn)在不光父視圖對theLabel有所有權(quán),self也對theLabel有所有權(quán),他們是同時(shí)擁有theLabel的
使用Property屬性的時(shí)候,如果用到了setter方法,必須在dealloc中release。
至于addSubview方法所retain的引用計(jì)數(shù),由父視圖進(jìn)行release,由于addSubview是UIView的API,所以release也不需要我們來進(jìn)行操作的。