我遇到了一些陌生的Objective-c内存管理代码。之间有什么区别?

// no property declared for myMemberVariable in interface
id oldID = myMemberVariable;
myMemberVariable = [MyMemberVariable alloc] init];
[oldID release];

和:
// (nonatomic, retain) property is declared for myMemberVariable in interface
self.myMemberVariable = [[MyMemberVariable alloc] init];

谢谢!

最佳答案

第二个在技术上是不正确的,但是第一个可能是由于尚未采用Objective-C 2.0属性语法的人造成的。如果您是OS X的长期开发人员(或者甚至是更长的NextStep / OS X的开发人员),那么它是最近才添加的,因此您确实会看到人们在不使用它的情况下不这样做而不会带来任何好处或损害。

因此,第一个基本上与以下内容相同:

[myMemberVariable release];
myMemberVariable = [[MyMemberVariable alloc] init];

假定您具有“保留”属性,则使用setter的正确版本应为:
// this'll be retained by the setter, so we don't want to own what we pass in
self.myMemberVariable = [[[MyMemberVariable alloc] init] autorelease];

10-04 20:14