有或没有实例variables的Objective-C属性

可能重复:
Objective-C 2.0中的属性和实例variables

我正在使用属性只为ivars,不需要任何真正的validation时获取或设置一个类,我正在创作的值。

Ex: @interface ClassB : NSObject { // No ivars } @property (nonatomic, retain) ClassA *obj; @property (nonatomic, retain) NSString *str; 

每当我在类中调用这些方法,我总是使用self.obj / self.str或[self obj] / [self str]。 通过这种方式来设置对象的状态,以便通过编译器生成的getter和setter更加仔细地pipe理引用。 这样说,有没有什么问题可以用这种方式来创build我的类? 另外,在没有ivar的情况下,在@implementation文件中被覆盖的“dealloc”方法需要什么“释放”?

如果使用@synthesize指令来创build属性访问器,那么编译器也会创build任何不在类声明之外的ivars。 你仍然需要释放你的ivars。 它曾经是你不能直接访问合成的ivars,所以必须在你的-dealloc方法中使用属性setter:

 - (void)dealloc { self.obj = nil; self.str = nil; [super dealloc]; } 

但是现在编译器会让你直接访问合成的伊娃,所以你可以释放它而不是调用setter(这在-dealloc中是一个好主意,而在其他地方是一个坏主意):

 - (void)dealloc { [obj release]; [str release]; [super dealloc]; } 

当你最终将你的代码转换为ARC(自动引用计数)时,这将会发生变化,因为编译器会负责在你的-dealloc中释放你的ivars。 大多数情况下,这意味着您的-dealloc实现可能会消失。

没有必要明确声明您的IVAR。 我甚至build议省略它们,因为你应该总是通过访问者访问IVars(正如你指出你已经做了什么)。

你不会遇到任何问题,除非debugging器不再直接捕获IVar(它们不会很好地显示在你的控制台旁边) – 但这不是一个真正的问题。

在你的dealloc方法中,你不需要再释放它们。 你需要做的是零。

self.obj = nil;

下面是属性实际意义的简要概述:(这是为了向你展示当你在dealloc中没有variables的时候发布一个版本)

分配

@属性(分配)NSString *名称;

 name = newValue; 

保留

@property(retain)NSString * name;

 if (name != newValue) { [name release]; name = [newValue retain]; } 

复制

@属性(复制)NSString *名称;

 if (name != newValue) { [name release]; name = [newValue copy]; } 

编译器自动为您创buildivar,即使它没有在ivar列表中明确定义。 它和房地产清单上的名字一样。 现在编译器不需要重复的定义行。

如果你有需要释放的属性(ivars),那就去做吧。