内存管理 - 冗余副本

时间:2012-01-02 17:45:28

标签: objective-c

之间有什么区别:

@synthesize something;
…
NSObject *tempThing = [[NSObject alloc] init];
self.something = tempThing;
[tempThing release];

@synthesize something;
…
self.something =  [[NSObject alloc] init];

第一个版本似乎多余,但我怀疑它可能有一个我没有看到的好处,因为我在很多例子中看到它。

3 个答案:

答案 0 :(得分:2)

如果声明属性保留,例如

@property (nonatomic, retain) id something;

然后当你打电话

self.something = newValue;

// OR (the two are equivalent)

[self setSomething:newValue];

setter实现将保留newValue

因此

   retain +1             retain +1
       |                     |
+------------+    +---------------------+
|            |    |                     |
self.something =  [[NSObject alloc] init];

如果你release something dealloc +1,那么你仍然会有autorelease保留,你将不会被释放。

要更正此问题,请使用您的第一种方法(最好是这种方法)或添加self.something = [[[NSObject alloc] init] autorelease];

{{1}}

那么为什么要使用第一种方法呢? /为什么在例子中看到这个?

在内存受限的环境中,掌控你的记忆力是件好事。因此,当他们不再需要充分利用环境时,您应该明确地发布内容。

答案 1 :(得分:0)

答案取决于something的属性;
如果是retain,第一种方法在第二版时是正确的,则保留something两次。因此,第二种方法应该是 something = [NSObject alloc] init];

如果是assign,则第一种方法不会保留something,因此它应该是
self.something = [tempThing retain];

答案 2 :(得分:0)

这两个代码示例肯定是不同的,但它们的实际行为取决于您的属性声明。

  1. 如果属性something具有assign属性,则顶部示例将分配的第一个NSObject的净保留计数为0,而最低示例的净保留计数为1。
  2. 如果属性something具有retain属性:top =在第一个NSObject上计数为1,则底部=在第一个NSObject上计数为2
  3. 如果属性something具有copy属性:top =第一个NSObject上的计数为0,第二个NSObject上的计数为1(因为副本分配第二个实例!),bottom = count为1 on第一个NSObject(第一个NSObject也被泄露了!),第二个NSObject上的数量为1。
  4. 以下是您的示例以及一些可以更好地解释的评论:

    @synthesize something;
    …
    NSObject *tempThing = [[NSObject alloc] init]; //1st NSObject: +1 retain count
    self.something = tempThing;     //1st NSObject: +0 if assign or copy, +1 if retain
                                    //2nd NSObject: +1 if copy
    [tempThing release];            //1st NSObject: -1 retain count
    

    -

    @synthesize something;
    …
    self.something =  [[NSObject alloc] init]; //2nd NSObject: +1 if copy
                                   //1st NSObject: +1 if assign or copy, +2 if retain
    

    有关属性属性的更多信息:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html