当前位置:  开发笔记 > IOS > 正文

将实例变量与Modern Runtime一起使用

如何解决《将实例变量与ModernRuntime一起使用》经验,为你挑选了1个好方法。

我在Obj-c和Cocoa有几年的经验,但我刚刚回到它和Obj-C 2.0等的进步.

我正试图绕过现代运行时并声明属性等.让我感到困惑的一件事是现代运行时能够隐式创建iVar.当然,这意味着在您的代码中,您应始终使用self.property来访问该值.

但是,在init*和dealloc(假设您不使用GC)方法中,我们应该直接使用iVar(在当前运行时).

所以问题是:

    我们应该使用init*中的属性访问器和使用Modern Runtime的dealloc吗?

    如果是这样,为什么会有所不同?是不是因为编译器看不到iVar?

    如果我需要覆盖一个访问器,我是否仍然可以访问将在运行时定义的iVar,或者我是否必须定义运行时将使用的实际iVar?

    同样,如果我可以访问合成的iVar,为什么我不能继续为init*和dealloc方法执行此操作?

我多次阅读文档,但他们似乎对所有这些都有点模糊,我想确保我理解它以便决定如何继续编码.

希望我的问题清楚.


测试快速摘要:

    如果你没有在遗产中声明ivar,编译器就完全不满意了

    如果您#ifndef __OBJC2__在遗留编译器中使用ivar很高兴,您可以直接使用ivar和作为属性

    在现代运行时,您可以将ivar保留为undefined并将其作为属性进行访问

    在现代运行时,尝试直接访问ivar而不进行声明会在编译期间出错

    @private 当然,伊娃的宣言允许直接进入遗产和现代的伊塔尔

现在真的没有给出一个干净的方法吗?



1> Barry Wark..:

在当前(OS X 10.5/GCC 4.0.1)编译器中,您无法直接访问运行时合成的ivars.OS X运行时工程师之一Greg Parker将这种方式放在cocoa-dev列表中(2009年3月12日):

你不能在当前的编译器中.未来的编译器应该修复它.在此期间使用显式的@private ivars.@private ivar不应被视为合同的一部分 - 这就是@private的含义,由编译器警告和链接器错误强制执行.

为什么没有办法在.m文件中为新运行时显式声明实例变量?

有三个原因:(1)有一些非平凡的设计细节需要解决,(2)编译器 - 工程师时间有限,(3)@private ivars通常都足够好.

所以,现在你必须使用点符号来访问属性,即使在initdealloc.这违背了在这些情况下直接使用ivars的最佳做法,但没有办法绕过它.我发现在大多数情况下,使用运行时合成的ivars(以及性能优势)的难易程度超过了这一点.如果您确实需要直接访问ivar,可以使用@private ivar,正如Greg Parker所建议的那样(没有什么可以阻止您混合显式声明和运行时合成的ivars).

更新使用OS X 10.6,64位运行时允许直接访问合成的ivars via self->ivar.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有