以下示例说明了如何为Person类实现dealloc方法:
@interface Person : NSObject
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (assign, readonly) NSString *fullName;
@end
@implementation Person
// ...
- (void)dealloc
[_firstName release];
[_lastName release];
[super dealloc];
}
@end
以上内容来自Apple文档: memory management example
我的问题是为什么在dealloc中的firstName和lastName之前有下划线?
答案 0 :(得分:2)
通常会合成属性:
@synthesize firstName = _firstName, …;
答案 1 :(得分:1)
方法::默认情况下,在合成getter和setter访问器方法时,假定属性和ivar具有相同的名称。
这可能会让您在使用getter / setter方法时以及何时直接访问ivar时会感到困惑。
替代方案是将ivar命名为与财产不同。一种常见的方法是使用下划线作为ivars名称的前缀。
您可以参考此链接:http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html
答案 2 :(得分:1)
执行self.firstName
时,您实际上正在调用getter firstName
(self.firstName = @""
调用setFirstName:
也是如此。那些getter和setter方法实际上访问了底层实例变量,像这样:
- (NSString *)firstName
{
return _firstName;
}
当你执行_firstName时,你直接访问实例变量而不通过setter。人们在init
和dealloc
期间直接访问实例变量的原因是setter方法或观察[1]属性的对象可以运行代码。这可能很糟糕,因为对象可能还没有完成初始化(在init
中),或者某些属性已经被释放(在dealloc
中)。
当您编写@sythesize firstName = _firstName
时,您将专门命名基础实例变量_firstName
而不是firstName
。这样,您不会意外地键入firstName
并绕过setter方法&志愿。如果不编写@synthesize
,编译器会自动命名实例变量_firstName
。
只是个人推荐 - 我会使用ARC,这样你就不必处理dealloc了。
[1]键值观察是一种对象可以注册以通知属性更改的方式。它会通过@synthesize
或正确命名的getter
和setter
方法自动提供。