目标C - 基本问题?

时间:2010-11-17 21:58:56

标签: iphone objective-c

  

可能重复:
  Why use 'self.' when its not forced?

这两个代码块之间有什么区别?

@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”?

4 个答案:

答案 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;