关于自我。在viewDidUnload中

时间:2011-07-25 06:58:31

标签: iphone objective-c cocoa-touch

我有iPhone: Why do I need self.<> in viewDidUnload?

的服务员问题

由于使用self.instance和instance之间存在差异,何时才实际使用实例?只是将引用设置为nil似乎没用?为什么选择呢?

1 个答案:

答案 0 :(得分:0)

通常,您会在此处找到许多有用的信息:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html%23//apple_ref/doc/uid/TP40004447-SW4

对于本答复的其余部分,我将假设您指的是在.m文件中使用@synthesize指令自动合成的属性。

执行摘要

当您使用表单self.property时,将自动为您保留/释放。当您使用不带自我前缀的表单instanceVariable时,您可以使用retain / release。

更长的解释

当你省略“自我”时。另外,您真正要做的是访问自动生成的底层ivar,编译器给出了与您给予该属性相同的名称。

如果您不希望编译器生成同名的ivars,那么您可以使用@synthesize指令的扩展形式,如下所示:

@synthesize myvariable=__myvariable;

这样,您将要求编译器创建一个名为__myvariable的底层ivar,而不是默认的myvariable。

使用此扩展表单,您可以引用self.myvariable(作为属性)或__myvariable(作为实例变量),这可以方便地在视觉上区分这两种类型的访问。

有了这个,我们就可以了解问题的实质。

当你使用self.myvariable时,你隐式调用了访问器方法(可能为方便起见而合成),如下所示:

self.myvariable = @"Some string";

等于

[self setMyvariable: @"Some string"];

或者,在右手使用财产的情况下

myLocalVar = self.myvariable;

等于:

myLocalVar = [self myvariable];

上述示例使用Apple推荐的访问者名称。

另一方面,直接使用实例变量时,只需直接分配变量而无需通过访问器。

现在,在iPhone上使用访问器的一个巨大优势是自动合成的访问器也会处理保留/释放消息,因此您不必担心这一点 - 或者浪费代码行处理这个有点乏味的问题东西。

由于在阅读属性时无需担心保留/释放,您可能会认为您只需要在作业的左侧使用属性语法(使用self。),所以无论你是否想要在赋值的右侧使用self.-syntax,部分是风格问题。

就个人而言,我开发了一种风格,我尽量不参考自动合成的ivars,除非我在@synthesize指令中指定了它们。否则Apple有一天可能会改变未指定的@synthesize指令的工作方式,而我的构建会破坏。但这只是我个人的预防措施。

所有这些都有一个例外,正如本答案顶部链接的文档中所述 - 那就是你不应该在init *方法中使用类的自己的实例变量的访问器。在Mac中,您不应该在dealloc方法中使用它们,但这是Apple的编码建议在两个平台之间有所不同的一点。

好的,这是一个很长的答案,只是说,阅读文档,但我希望它澄清一点点。参考计数环境中的内存管理并非易事,所以如果一开始并不清楚,请不要绝望。

PS:如果您认为这是其他人应该为您解决的那种担忧,请记录Apple的一个错误,要求在iOS上进行垃圾收集。它在64位OS X上运行良好。