点语法问题

Ale*_*Tau 2 objective-c

self.flipsidenavigationbar=aNavigationBar;  
Run Code Online (Sandbox Code Playgroud)

为什么这里需要自我?(否则它会崩溃)

[flipsidenavigationbar pushnavigationietm........]; 
Run Code Online (Sandbox Code Playgroud)

为什么不需要自我?

请注意,flipsidenavigationbar是一个声明为属性并合成的iVar.

谢谢

亚历克斯

Eya*_*ler 5

您需要记住的是,点不仅是访问iVar的语法,而且是调用设置(或获取)ivar的方法的简写.

这意味着self.foo与foo不同(假设foo是声明为属性的ivar).self.foo =值; 相当于[self setFoo:value]; 或者value = self.foo相当于value = [self foo]; 当你刚写foo时,你就是在没有任何方法调用的情况下直接访问foo.

区别很重要,因为setter和getter方法通常不只是分配或获取值,而是保留值.

所以,在你写的情况下:

self.flipsidenavigationbar=aNavigationBar;
Run Code Online (Sandbox Code Playgroud)

你实际上正在为这个ivar调用setter方法,所以这一行相当于:

[self setFlipSideNavigationBar:aNavigationBar];
Run Code Online (Sandbox Code Playgroud)

假设该属性被定义为复制或保留,则调用setter将保留aNavigationBar.另一方面,如果你写:

self.flipsidenavigationbar = aNavigationBar;

然后你只是直接设置self.flipsidenavigationbar的值,并且不保留aNavigationBar,这可能会导致应用程序在以后访问aNavigationBar时崩溃

关于另一个问题:

[flipsidenavigationbar foo];
Run Code Online (Sandbox Code Playgroud)

只是一个方法调用,您不必使用点(虽然有时可能需要),因为您可以直接在实例方法中引用ivars.

(顺便说一句:为什么不用骆驼的情况?这真的伤害了眼睛)