【问题标题】:How can I avoid redundancy while declaring new class attributes in Objective-C?在 Objective-C 中声明新的类属性时如何避免冗余?
【发布时间】:2010-11-16 19:48:26
【问题描述】:

在我的代码中,每当我的类需要一个新的对象属性时,我通常会将其名称复制/粘贴到 4 个不同的地方!

  • 头文件中的声明(NSObject * myObject;
  • @property()
  • 实现中的@synthesize()
  • dealloc: 下发布(当然只针对对象)

我这样做是因为它有效,而不是因为我完全了解发生了什么。我知道头文件中的声明允许其他类看到它的属性,属性说明符决定了如何构造它的 getter/setter 方法。而综合线实际上构建了那些 getter/setter 方法。我也知道原始类型应该使用 (nonatomic,assign) 而不是 (nonatomic,retain),但我不知道什么时候应该省略非原子。

我可以做些什么来避免代码中的冗余。如果我在课堂上更改或添加变量,我必须检查 4 个不同的地方,而且它会很快变旧。是否有任何按键可以使此过程更快?是否有代码行我可以简化或组合以获得相同的结果?

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:

    Accessorizer 将为您自动完成很多工作。

    【讨论】:

    • 看起来很有用,以后我自己做一些Objective-C开发的时候可能会研究一下。
    【解决方案2】:

    在最新版本的 Clang 中(附带 XCode 4,尚未在 XCode 3 中提供),您将获得默认的 @synthesize 以及默认的 ivar 创建。默认 ivar 创建已经有效,但在模拟器上无效。有了这两个功能,您只需添加@property 行并处理dealloc 中的内存管理

    就非原子与原子而言。 atomic 是默认值,当您离开 nonatomic 注释时会发生什么。 Atomic 保证在允许任何东西访问它之前完全设置该值,nonatomic 则不能。 Atomic 仅在线程情况下有用,在单线程应用程序中稍慢。

    【讨论】:

    • 不幸的是我还没有访问 XCode 4。不过我很期待。
    • 这也适用于 Xcode 3.2.4。将您的编译器设置为 LLVM 1.5 并将 -Xclang-fobjc-nonfragile-abi2 添加到您的“其他 C 标志”中。如果您这样做,您只需声明属性(不需要 ivar 和 @synthesize)并通过 setter 和 getter 访问它。 AFAIK 需要另一种解决方法来访问自动生成的 ivar(我不记得了),但我发现这通常没有必要。
    • 它也适用于模拟器。我在几个项目中使用了这种技术。
    • 嗯,这对我来说听起来很可怕。我只是在做这个项目的兼职工作,而且几乎完成了,所以似乎不值得冒险破坏低级的东西。但感谢 Ole Begemann 的投入。
    【解决方案3】:

    了解每一行代码的作用很重要。它们并不完全相同,并且它们不一定是多余的。有用的一件事是使用正确的术语——例如,NSObject *myObject; 您可能指的是实例变量声明。

    首先,@interface 中的 @property 声明让您可以说类的实例公开了一个状态。它并没有说明该状态的实现,只是它由您的类的实例和该状态的 API 协定(内存管理、原子性、方法)公开。

    @synthesize 指令告诉编译器创建或使用特定实例变量作为已声明 @property 的存储。 这不一定是您为属性提供存储的方式。例如,Core Data 为建模属性提供自己的存储,因此您可以使用@dynamic 来代替。您也不需要使用与@property 同名的实例变量——为了扩展上面的示例,您可以将实例变量命名为myObject_,同时将属性命名为object,这非常好。

    最后,您将实例变量-release 发送到-dealloc — 用于标记为retaincopy 的对象类型属性 — 因为您说过您将管理它的内存。您不是在释放 property,而是在释放 storage。如果您以其他方式实现存储,您会以其他方式清理它。

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多