MRC中成员变量和Property属性的内存管理和addSubview方法的理解

在类中定义成员变量和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的工程中是非常常见的一种写法, 因为我对theLabelalloc操作已经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也不需要我们来进行操作的。

你可能感兴趣的:(MRC中成员变量和Property属性的内存管理和addSubview方法的理解)