【发布时间】:2010-11-03 16:53:24
【问题描述】:
我在 Obj-c 和 Cocoa 方面有几年的经验,但现在才刚刚回到它以及 Obj-C 2.0 等方面的进步。
我试图了解现代运行时并声明属性等。让我有点困惑的是现代运行时中隐式创建 iVar 的能力。当然,这意味着在您的代码中,您应该始终使用 self.property 来访问该值。
但是,在 init* 和 dealloc(假设您没有使用 GC)方法中,我们应该直接使用 iVar(在当前运行时中)。
所以问题是:
我们是否应该在 init* 中使用属性访问器并在 Modern Runtime 中解除分配?
如果是这样,为什么会有所不同?仅仅是因为编译器看不到 iVar 吗?
如果我需要覆盖访问器,我是否仍可以访问将在运行时定义的 iVar,还是必须定义运行时将使用的实际 iVar?
再次,如果我可以访问合成的 iVar,为什么我不能继续对 init* 和 dealloc 方法执行此操作?
我多次阅读文档,但它们似乎对所有这些内容都有些模糊,我想确保我能很好地理解它,以便决定如何继续编码。
希望我的问题很清楚。
测试快速总结:
如果在 legacy 中不声明 ivar,编译器完全不爽
如果您在旧版编译器中围绕 ivar 使用
#ifndef __OBJC2__很高兴,您可以直接使用 ivar 和作为属性在现代运行时,您可以保留 ivar 未定义并作为属性访问
在现代运行时,尝试直接访问 ivar 而不声明会在编译期间出错
@private的 ivar 声明当然允许直接访问旧版和现代版的 ivar
现在真的没有给出一个干净的前进方式吗?
【问题讨论】:
-
为了澄清那些可能会感到困惑的人,“现代运行时”是指新的 Objective-C 运行时,它可能仅由 iPhone 应用程序和 64 位进程使用10.5 或更高。任何在 32 位或 Tiger 或更早版本上运行的 Objective-C 代码都在“Legacy Runtime”下运行。
-
@Quinn - 我不知道 iPhone OS 使用现代运行时。太甜了。
-
@Quinn - 感谢您的澄清,我应该把它放在原始消息中。
标签: objective-c macos objective-c-runtime