点语法问题

时间:2010-02-26 14:01:59

标签: objective-c

self.flipsidenavigationbar=aNavigationBar;  

为什么这里需要自己? (否则崩溃)

[flipsidenavigationbar pushnavigationietm........]; 

为什么不需要自我?

请注意,flipsidenavigationbar是一个声明为属性且已合成的iVar。

谢谢

亚历

3 个答案:

答案 0 :(得分: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;

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

[self setFlipSideNavigationBar:aNavigationBar];

假设该属性被定义为copy或retain,那么调用setter将保留aNavigationBar。另一方面,如果你写:

self.flipsidenavigationbar = aNavigationBar;

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

关于另一个问题:

[flipsidenavigationbar foo];

只是方法调用,您不必使用点(尽管有时可能需要),因为您可以直接在实例方法中引用ivars。

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

答案 1 :(得分:2)

flipsidenavigationbar声明为“保留”属性类型?我猜这是怎么回事。

您编写的点语法方法等同于

[self setFlipsidenavigationbar:aNavigationBar];

此方法调用可能在设置时保留aNavigationBar对象。当你打电话

flipsidenavigationbar = aNavigationBar;

保留它,它可能会在您想要它之前被释放并导致您的崩溃。

您可以在Obj-C中阅读有关dot syntax的更多信息,它可能会帮助您解决此类问题。


另外两张海报说它更好,但要记住这两行非常重要:

self.myViewA = myViewB;
myViewA = myViewB;

有可能完全无关。点语法只是方法调用的简写,您可以使该方法调用执行您想要的任何操作。重要的是,不要像处理评论中提到的那样处理属性,而是要制定规则

  

我明白当需要的时候   设置/初始化您需要的属性   放在那里'自我'。但是,当你“告诉”   它做某事(在这种情况下)   推)你不需要自己。

你应该准确理解发生了什么,所以你知道你的点语法用法的影响是什么。我知道这很令人困惑,但实际上并不难,每个人都很快就会把它拿起来。祝你好运!

答案 2 :(得分:2)

由于点符号的疯狂。我实际上建议新的ObjC开发人员完全避免它,因为完全是上述混乱。

flipsidenavigationbar是一个指针。它只是 指针。如果你说flipsidenavigationbar = aNavigationBar,你用另一个指针替换一个指针。如果您保留以前的指针,则不会释放它。您没有开始保留aNavigationBar。这是C.这里没有魔法。

self.flipsidenavigationbar 不是一个简单的指针(尽管看起来完全像一个结构)。这是一个方法调用。作为右值,它是[self flipsidenavigationbar]。作为左值,它是[self setFlipsidenavigationbar:]。这些呼叫代码。在大多数情况下,setFlipsidenavigationbar:方法包括旧值的释放和新值的保留。

为避免混淆,您应该做几件事:

  • 始终,始终使用访问者访问您的ivars。切勿直接访问它们。
  • 为了帮助实现这一目标,请不要将您的ivars定义为与访问者具有完全相同的名称。所以你会有一个名为_flipSideNavigationBar的ivar映射到flipSideNavigationBar。其语法为@synthesize foo = _foo
  • 只要您能够这样做,就避免使用点符号。我们这些在点符号之前一直在ObjC编程的人很少会遇到麻烦,因为我们直觉地知道它在做什么,而且输入起来要容易一些。但它对新开发人员来说非常困惑,我通常建议避免使用它。学会说[self foo][self setFoo:]。代码将更有意义。