之间有什么区别:
@synthesize something;
…
NSObject *tempThing = [[NSObject alloc] init];
self.something = tempThing;
[tempThing release];
和
@synthesize something;
…
self.something = [[NSObject alloc] init];
第一个版本似乎多余,但我怀疑它可能有一个我没有看到的好处,因为我在很多例子中看到它。
答案 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)
这两个代码示例肯定是不同的,但它们的实际行为取决于您的属性声明。
something
具有assign
属性,则顶部示例将分配的第一个NSObject的净保留计数为0,而最低示例的净保留计数为1。something
具有retain
属性:top =在第一个NSObject上计数为1,则底部=在第一个NSObject上计数为2 something
具有copy
属性:top =第一个NSObject上的计数为0,第二个NSObject上的计数为1(因为副本分配第二个实例!),bottom = count为1 on第一个NSObject(第一个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