【问题标题】:Setting a property to nil when creating it with "assign"使用“assign”创建属性时将其设置为零
【发布时间】:2011-10-13 19:22:24
【问题描述】:

如果我创建一个带有“assign”属性的属性,在 dealloc 方法中将该属性设置为 nil,会发生什么

@property (nonatomic, assign) NSString* myData;

- (void)dealloc {
    self.myData = nil;
}

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch retaincount


    【解决方案1】:

    然后调用setter,它只是将指针设置为nil,没有其他任何事情发生。

    编辑:(非原子,分配)和(非原子,保留)之间的区别

    assign-property 只会设置指针,retain-property 也会在旧对象上调用释放并在新对象上保留。

    合成的(nonatomic, assign)-setter 将如下所示:

    -(void) setMyData:(NSString*)value
    {
        myData = value; //just assigning the pointer
    }
    

    而合成的(nonatomic, retain)-setter 将如下所示:

    -(void) setMyData:(NSString*)value
    {
        [value retain];   // retain new object
        [myData release]; // release old object. if myData is nil: nothing happens
        myData = value;   // assigning the pointer
    }
    

    吸气剂之间没有区别。两者都只是非原子的。

    【讨论】:

    • 通常我们做@property (nonatomic, retain) NSString* myData;那么这里有什么区别呢。
    【解决方案2】:

    这样做没有错。

    这样做通常没有任何好处。它不会有任何效果,除非在 dealloc 中运行更多的代码,这取决于 myData 的值。

    当您将声明和定义为 retain 的属性设置为 nil 时,会导致 release 发送到之前的属性值。但是当它被定义为分配时,这不会发生。它基本上只是设置实例变量,这在 dealloc 中通常无关紧要,因为没有其他东西会读取实例变量的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      相关资源
      最近更新 更多