2012-03-11 39 views
3

我有几个简单的问题,以确保我在我的应用程序中使用属性。我在网上阅读了很多内容,但目前还不清楚。非常感谢您的帮助或建议。iPhone的属性

(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 
+0

对于最后一个问题:http://stackoverflow.com/questions/9276136/what-is-the-need-of-assigning-nil-after-releasing-an-object?answertab=active#tab -top – Saphrosit 2012-03-11 17:32:21

+0

太棒了,自从那篇文章有帮助以后,我就把它拿出来了。 – Vikings 2012-03-11 17:34:45

+1

[Synthesized属性和变量与下划线前缀:这是什么意思?]可能重复(http://stackoverflow.com/questions/6049269/synthesized-property-and-variable-with-underscore-prefix-what-does-这意味着) – 2012-03-11 18:54:33

回答

5
@synthesize personName = _personName; 
  1. 这条语句创建了personName属性的存取方法。您已指定访问者应使用名为_personName的实例变量。如果您刚刚拥有@synthesize personName;,则访问器将使用personName作为实例变量。

  2. 你通常应该使用存取方法,如self.personNamesomePerson.personNamesomePerson.personName = @"Joe";。如果你不关心备份personName财产的伊娃的名称,则无需指定它。

  3. 使用-viewDidLoad中的访问器,如:self.personName = nil;。与-didReceiveMemoryWarning:相同。是否使用伊娃或-dealloc中的财产是有争议的,并且在某种程度上与品味有关。使用-dealloc中的属性访问器的主要关注点是,如果您的类被子类化并且访问器被覆盖,它可能会导致问题。通常情况下,你不需要担心,因为你知道你的班级不会被分类。

  4. 发布伊娃后设置为零也是有争议的。许多人认为这样做很好,其他人觉得这是浪费时间。用你最好的判断力。这当然不是必需的,而是某些人认为是良好的家务问题。

+0

我仍然有点_conf在_personName,它似乎是不必要的,但我看到一些很多的例子,包括苹果的例子。 – Vikings 2012-03-11 17:45:47

+0

另外,我是否应该在dealloc中释放_personName?或self.personName和_personName? – Vikings 2012-03-11 17:48:43

+0

@ Vikings1201使用下划线可以更容易地直观地发现直接访问ivar的那些位置(几乎所有情况下都应该在自定义访问器方法中) – 2012-03-11 17:58:25