自变量和变量差异

Shy*_*yne 5 cocoa cocoa-touch objective-c declared-property

是什么区别self.myVariable = obj;myVariable = obj;,当我使用@propery/ @synthesize创建`MYVARIABLE?

rpj*_*rpj 14

重要的是要注意点编译器将点语法转换为简单的objc_msgSend调用:也就是说,它下面的行为就像发送给该变量的访问者的消息一样.因此,以下所有三个都是等效的:

self.myVariable = obj;

[self setMyVariable:obj];

objc_msgSend(self, @selector(setMyVariable:), obj);
Run Code Online (Sandbox Code Playgroud)

当然,这意味着使用点语法实际上会导致完整的消息发送,这意味着调用一个新函数以及与之相关的所有开销.相反,使用简单赋值(myVariable = obj;)不会产生这种开销,但当然它只能在所讨论的类的实例方法中使用.


Jan*_*les 13

@synthesize指令告诉编译器根据.h文件中@property指令中给出的规范为成员变量生成访问器.(即,如果指定retain,则setter将保留变量,如果指定copy,则会复制它.)

访问器将(除非您另行指定)将命名为propertyName和setPropertyName.

使用 .符号(注意,不是上面提到的自语法)是说你想要使用访问器(如果你设置字符串是一件好事,并且想要确保保留计数是正确的).

所以,在你的类实现中:

  • self.bill = fred将调用accessor setBill.
  • bill = fred将直接将账单设置为fred,而无需通过访问者.


Nie*_*sen 5

我在启动Cocoa开发时发现的一个差异是,如果我将变量设置为使用@ Property/@ Synthesize语法,并且我没有使用self.myVariable = obj[self setMyVariable:obj],而是使用 myVariable = obj,如果稍后释放obj,则不保留对象.(假设@Property设置为使用retain.)

原因是当使用myVariable = obj时未设置保留计数,并且当释放obj时,计数现在为零.(除非你自己保留)但是通过使用访问器,它将为你做保留计数.(再次假设您将其设置为在声明时使用retain).


zou*_*oul 2

self语法使用访问器方法,其他语法则不使用。如果访问器执行的操作不仅仅是简单地分配新值,这可能会产生很大的差异。请参阅Objective-C 教程的声明属性部分。