这两个代码块之间有什么区别?
@property (nonatomic, retain) MyObject *myObject;
MyObject *obj = [[MyObject alloc] init];
self.myObject = obj;
[obj release];
MyObject *obj = [[MyObject alloc] init];
myObject = obj;
[obj release];
编辑:
这是否意味着在第二个区块我不需要发布“obj”?
答案 0 :(得分:1)
在第一种情况下,self.myObject
表示myObject
是@property
,当您使用self.myObject = obj
分配时,将调用该属性的setter。通常,编译器使用@synthesize
指令自动生成该setter。如果该属性的自动生成的setter标记为retain
,那么分配给它的任何内容(在这种情况下,obj
)都将被属性保留。
在第二种情况下,myObject
可能是也可能不是财产。无论如何,这是一个简单的任务。没有retain
完成。
答案 1 :(得分:0)
第一个调用self
的访问者,第二个调用MyObject *obj = [[MyObject alloc] init];
[self setMyObject:obj];
[obj release];
。第一个块的逻辑等效项可能是:
{{1}}
正如您所看到的,在第二行上发生了一个方法调用,这不会发生在第二行的第二行。
答案 2 :(得分:0)
self
用于访问类/实例属性(访问者)。例如,如果您在头文件中定义了一个属性(使用@property
),那么使用self.myClassProperty
是一种很好的做法(对于代码可读性等)。不使用self
关键字访问局部变量,例如在函数内部声明的变量(甚至是作为成员的外部函数)。
类似的SO问题:Objective-C - When to use 'self'
答案 3 :(得分:0)
取决于您在头文件中声明myObject的方式。样板代码中的普遍做法使那些半同等。
区别在于1保证使用名为myObject的属性,因此将触发getter和setter函数。
第二个访问实例变量,不保证使用getter和setter函数。如果您的ivar与属性具有相同的名称,则应使用setter和getter函数。
让这个更明确的方法是在你的所有ivars上添加一些内容。 (例如mMyObject)然后在@synthesize中使用mutator @synthesize myObject = mMyObject;