self.flipsidenavigationbar=aNavigationBar;
为什么这里需要自己? (否则崩溃)
[flipsidenavigationbar pushnavigationietm........];
为什么不需要自我?
请注意,flipsidenavigationbar是一个声明为属性且已合成的iVar。
谢谢
亚历
答案 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:
方法包括旧值的释放和新值的保留。
为避免混淆,您应该做几件事:
_flipSideNavigationBar
的ivar映射到flipSideNavigationBar
。其语法为@synthesize foo = _foo
。[self foo]
和[self setFoo:]
。代码将更有意义。