我知道声明的属性生成访问方法,这在某种程度上只是语法糖。
我发现很多人在他们的dealloc
方法中使用self.property = nil
。
1) Apple的Memory Management文档,p23它说:
唯一不应该使用访问方法来设置实例变量的地方是init方法和dealloc。
为什么不能?
苹果的<<p> 2) strong> objective - c 2.0 , p74声明的属性基本上取代了访问器方法声明;当您合成属性时,编译器只创建任何缺席的访问器方法。没有与
注意:通常在dealloc
方法的直接交互-属性不会自动为您释放。然而,声明的属性确实提供了一种有用的方法来交叉检查您的dealloc
方法的实现:您可以在头文件中查找所有属性声明,并确保未标记为assign
的对象属性被释放,而标记为assign
的对象属性未被释放。dealloc
方法中,您应该直接release
对象实例变量(而不是调用set访问器并将nil
作为参数传递),如下例所示:
- (void)dealloc { [property release]; [super dealloc]; }
如果使用现代运行时并合成实例变量,则不能直接访问实例变量,因此必须调用accessor方法:
- (void)dealloc { [self setProperty:nil]; [super dealloc]; }
这个注释是什么意思?
我发现[property release];
和[self setProperty:nil];
都工作
设置一个属性可以导致通知被发送到观察该属性的其他对象。这可能反过来导致那些对象试图对你的对象做进一步的事情。如果您正在解除分配,这可能不是您希望发生的事情。所以一般来说,直接release
相关的实例变量更安全。
请注意,这类问题只会在某些情况下出现,所以在dealloc
中使用self.property=nil
编写代码通常是完全可能的,并且一切都很好。这不是最佳实践。
在Objective-C"现代运行时"中,可以不指定ivar而声明属性。运行时将合成存储以配合合成的访问器。在这种情况下,您不能直接释放ivar,因为就您的代码而言,不存在ivar。所以你别无选择,只能走self.property=nil
路线。