如何在Objective-C中声明新的类属性时避免冗余?

时间:2010-11-16 19:48:27

标签: iphone objective-c properties

在我的代码中,每次我需要一个新的对象属性时,我通常会在4个不同的地方复制/粘贴它的名字!

  • 标头文件(NSObject * myObject;
  • 中的声明
  • @property()
  • 实施中的@synthesize()
  • dealloc:下发布(当然仅限于对象)

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

我可以做些什么来避免代码中的冗余。如果我在课堂上更改或添加变量,我必须检查4个不同的地方,并且它变得非常快。有没有任何关键的笔画可以让这个过程更快?是否有我可以简化或组合的代码行来获得相同的结果?

3 个答案:

答案 0 :(得分:5)

Accessorizer会为您自动完成很多此操作。

答案 1 :(得分:3)

在最新版本的Clang(Ships with XCode 4,尚未在XCode 3中)中,您将获得默认的@synthesize以及默认的ivar创建。默认的ivar创建已经有效,但在模拟器上却没有。使用这两个功能,您需要做的就是添加@property行并处理dealloc

中的内存管理

至于非原子与原子。原子是默认值,当您不使用非原子注释时会发生什么。原子保证在允许任何访问它之前完全设置值,非原子不会。 Atomic仅在线程化情况下有用,在单线程应用程序中稍慢。

答案 2 :(得分:1)

了解每行代码的作用非常重要。它们并非完全相同,而且必然是多余的。有一点可以帮助我使用正确的术语 - 例如,NSObject *myObject;你可能指的是一个实例变量声明。

首先,@property中的@interface声明允许您说类的实例暴露了一段状态。它没有说明该状态的实现,只是说它是由类的实例和状态的API契约(内存管理,原子性,方法)公开的。

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

最后,您在-release中发送实例变量-dealloc - 对于标记为retaincopy的对象类型属性 - 因为您已经说过要管理它的记忆。您没有发布属性,而是发布存储。如果您以其他方式实现存储,则可以通过其他方式进行清理。