美文网首页
MRC中成员变量和Property属性的内存管理和addSubv

MRC中成员变量和Property属性的内存管理和addSubv

作者: coderZ | 来源:发表于2016-07-03 16:30 被阅读210次

    在类中定义成员变量和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属性的内存管理和addSubv

          本文链接:https://www.haomeiwen.com/subject/jgccjttx.html