我提出了几个简单的问题,以确保我在我的应用程序中正确使用属性。网上看了很多,还是不清楚。非常感谢任何帮助或建议。
(1) 我不太确定该声明是否有效,以及为什么需要它。
@synthesize personName = _personName;
为什么需要 _personName 变量?与仅仅创建一个属性并合成该变量 personName 相比,这样做有什么好处。
@property (nonatomic, retain) NSString *personName;
(2) 在我的应用程序中,我应该访问属性变量 self.personName 还是使用 _personName 变量。我相信 self.personName 到那时又是正确的,为什么 _personName 还在?
(3) 我也有点困惑我应该在 dealloc() 中释放哪个变量以及我应该在 viewDidLoad() 中将哪个变量设置为 nil。我也不知道是否应该对 didReceiveMemoryWarning() 方法进行任何更改。
@interface ViewController : UIViewController
{
NSString *_personName;
}
@property (nonatomic, retain) NSString *personName;
@end
@implementation ViewController
@synthesize personName = _personName;
- (void)viewDidLoad
{
[super viewDidLoad];
self.personName = [[NSString alloc] initWithString:@"John Doe"];
NSLog(@"Name = %@", self.personName);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (void)dealloc
{
[super dealloc];
}
@end
最佳答案
@synthesize personName = _personName;
该语句为
personName
属性创建访问器方法。您已指定访问器应使用名为_personName
的实例变量。如果您只有@synthesize personName;
,访问器将使用personName
作为实例变量。您通常应该使用访问器方法,如
self.personName
或somePerson.personName
或somePerson.personName = @"Joe";
。如果您不关心备份personName
属性的 ivar 的名称,则无需指定它。使用
-viewDidLoad
中的访问器,如:self.personName = nil;
。与-didReceiveMemoryWarning:
相同。是否在-dealloc
中使用 ivar 或属性是有争议的,并且在某种程度上是个人喜好问题。在-dealloc
中使用属性访问器的主要问题是,如果您的类被子类化并且访问器被覆盖,它可能会导致问题。通常,您不必担心这一点,因为您知道您的类不会被子类化。发布后将 ivar 设置为 nil 也值得商榷。许多人认为这样做是一种很好的风格,而另一些人则认为这是在浪费时间。使用你最好的判断。这当然不是必要的,而是一些人认为是良好内务管理的问题。
关于iPhone 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657154/