在我的代码中,每次我需要一个新的对象属性时,我通常会在4个不同的地方复制/粘贴它的名字!
NSObject * myObject;
)@property()
行@synthesize()
行dealloc:
下发布(当然仅限于对象)我这样做是因为它有效,不是因为我完全理解发生了什么。我知道头文件中的声明允许其他类查看其属性,属性说明符确定如何构造其getter / setter方法。合成行实际上构建了那些getter / setter方法。我也知道原始类型应该使用(nonatomic,assign
)而不是(nonatomic,retain
),但我不知道何时应该省略非原子。
我可以做些什么来避免代码中的冗余。如果我在课堂上更改或添加变量,我必须检查4个不同的地方,并且它变得非常快。有没有任何关键的笔画可以让这个过程更快?是否有我可以简化或组合的代码行来获得相同的结果?
答案 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
- 对于标记为retain
或copy
的对象类型属性 - 因为您已经说过要管理它的记忆。您没有发布属性,而是发布存储。如果您以其他方式实现存储,则可以通过其他方式进行清理。