2012-01-02 72 views
2

有什么区别之间:和 内存管理 - 冗余副本

第一个版本似乎是多余的,但我怀疑它可能有我没有看到一个好处

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

@synthesize something; 
… 
self.something = [[NSObject alloc] init]; 
,因为我在很多例子中看到它。

回答

2

如果该属性声明保留例如

@property (nonatomic, retain) id something; 

那么当你调用

self.something = newValue; 

// OR (the two are equivalent) 

[self setSomething:newValue]; 

二传手实施将采取newValue一个保留。

因此

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

如果release伊娃somethingdealloc,那么你将仍然有+1保留,你将不会被释放。

要纠正这一点无论使用第一种方法(这是优选的)或添加autorelease

self.something = [[[NSObject alloc] init] autorelease]; 

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

在内存受限的环境中,控制内存是件好事。所以,当他们不再充分利用环境时,你应该明确地发布它们。

+0

感谢Paul.s--一个非常明确的描述(对我来说)非直观的问题。 – Andrew 2012-01-02 20:00:48

+0

@Andrew特别注意这些属性。如果一个财产声明没有“保留”列出,那么你不想发布或autorelease,否则你会得到一个崩溃。 – MechEthan 2013-10-27 21:52:06

0

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

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

+0

感谢@Tatvamasi。该属性是保留的,所以是“something = [[NSObject alloc] init];”最好的选择?我认为在不使用二传手的情况下提到属性并不是好的做法,但在这种情况下,它似乎是做了需要的。 – Andrew 2012-01-02 21:39:03

0

代码的两个例子明显不同,但它们的实际行为取决于您的属性声明。

  1. 如果属性something具有assign属性,那么顶例如叶的1
  2. 用网分配的第一NSObject的保留的0计数和底部例如具有净保留计数如果属性somethingretain属性:top =第一个NSObject上的计数为1,bottom =第一个NSObject上的计数为2
  3. 如果属性something具有copy属性:top =第一个NSObject的计数为0 +第二个NSObject的计数为1分配第二个实例!),bottom =第一个NSObject的计数为1(第一个NSObject也泄漏了!),第二个NSObject的计数为1。

这里的一些评论中的例子来解释更好:

@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