在类中定义成员变量和Property属性,是为了可以方便的在类的作用域内引用变量
成员变量
@interface View1 ()
{
UILabel *_label;
}
首先明确一点,对成员变量进行赋值操作并不会令变量的引用计数增加
Property属性
@property (retain, nonatomic) UILabel *label;
对于Property属性,如果使用self.label = [[UILabel alloc] init];
这样的方式进行赋值,其实使用调用编译器生成的setter方法,会令引用计数增加1,声明self对Property属性的所有权
自定义setter方法的时候通常会这样写
- (void)setLabel:(UILabel *)label {
if (_label != label) {
[_label release];
_label = [label retain];
}
}
所以使用了setter方法的时候,一定要在dealloc中对Property属性释放
addSubview
使用成员变量
addSubview方法会导致引用计数+1
UILabel *theLabel = [[UILabel alloc] init];// theLabel的retainCount = 1
[self.view addSubview:theLabel];// theLabel的retainCount = 2, 父视图retain一次theLabel,父视图对theLabel有所有权
_label = theLabel;// theLabel的retainCount = 2
[theLabel release];// theLabel的retainCount = 1,release操作,对应alloc,现在只有父视图对theLabel有所有权
上述代码在MRC的工程中是非常常见的一种写法, 因为我对theLabel
的alloc
操作已经release
了,符合黄金法则。成员变量_label
只是指向theLabel
的指针而已。所以对于_label
来说不需要再进行release
操作了。
使用Property属性
UILabel *theLabel = [[UILabel alloc] init];// theLabel的retainCount = 1
[self.view addSubview:theLabel];// theLabel的retainCount = 2, 父视图retain一次theLabel,父视图对theLabel有所有权
self.label = theLabel;//theLabel的retainCount = 3, 调用setter方法,retainCount+1,
[theLabel release];//theLabel的retainCount = 2,release操作,对应alloc,现在不光父视图对theLabel有所有权,self也对theLabel有所有权,他们是同时拥有theLabel的
使用Property属性的时候,如果用到了setter方法,必须在dealloc中release。
至于addSubview方法所retain的引用计数,由父视图进行release,由于addSubview是UIView的API,所以release也不需要我们来进行操作的。
网友评论