2011-08-22 24 views
3

可能重复:
Properties and Instance Variables in Objective-C 2.0Objective-C的属性有或没有实例变量

我使用性质仅高德不需要任何真正的得到验证时,或设定一个我正在创作的类的值。

Ex: 
@interface ClassB : NSObject 
{ 
    // No ivars 
} 

@property (nonatomic, retain) ClassA *obj; 
@property (nonatomic, retain) NSString *str; 

每当我打电话,我总是用self.obj/self.str或[自OBJ]/[自STR]类中的这些方法。这样做是为了设置你被迫通过属性的对象的状态,以便由编译器生成的getter和setter更仔细地管理引用。有了这个说法,我可以用这种方式创建我的类吗?另外,在没有ivar的情况下,是否在@implementation文件中覆盖“dealloc”方法中需要“释放”?

回答

3

如果您正在使用@synthesize指令来创建属性访问器,编译器还将创建你离开了类声明的任何实例变量。你仍然需要释放你的ivars。它曾经是,你不能直接访问实例变量的合成,因此不得不使用属性setter在-dealloc方法是这样的:

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

这些天来,虽然,编译器将让你访问合成伊娃直接,所以你可以释放它,而不是调用setter方法(这是在-dealloc一个好主意,和一个坏主意,在其他地方):

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

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

+0

是否会更好的编程实践(直到ARC代码)做一个指针分配为零,或做一个发布? – 5StringRyan

+0

如果您保留了一个对象,则必须将其释放。只要将指针设置为零就会产生泄漏 - 你失去了对象的引用,但是你永远不会释放该对象。如果你想在释放它之后将指针设置为零,请随意。有些人喜欢看指针变为零。尽管如此,它在-dealloc中并没有什么帮助,因为无论如何,“self”即将被释放。 – Caleb

+0

在BJ Homers示例中,由于他直接分配self.obj/self.str = nil,因为它们没有被释放并且指针指定为零,是否会创建泄漏? – 5StringRyan

0

编译器自动为您创建ivar,即使它没有在ivar列表中明确定义。它的名称与房产列表中的名称相同。编译器现在不需要重复的定义行。

如果您有需要发布的属性(ivars),请执行此操作。

2

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

除了调试器不直接接收IVars,你不会遇到任何问题(它们不会很好地显示在你的控制台旁边) - 但这不是一个真正的问题。

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

自我。obj = nil;

-

这里是什么样的属性实际上属性指的是简要概述: (这是告诉你,当你在的dealloc NIL变量的释放情况)

分配

@property(assign)NSString * name;

name = newValue; 

保留

@property(保留)的NSString *名称;

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

副本

@property(副本)的NSString *名称;

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

这不是真的,你不应该总是通过getter和setter,它实际上鼓励直接在'init'和'dealloc'方法中访问ivars以避免潜在的副作用。您还可以访问合成属性以将其释放,例如'[_myProperty release]'意味着你可以像前面提到的那样避免'dealloc'中的间接访问 –

+0

好点。你有一个例外的前述经验法则:-) – pkluz

+0

@ Paul.s:合成的伊娃没有领先的下划线;它的名称与该属性完全相同。 –

相关问题