如果我致电
,会有什么干扰NSString *theNameToDisplay = _name;
或
NSString *theNameToDisplay = self.name;
我知道这可能是一个愚蠢的问题,但我看到两个版本都使用了很多,我没有发现输出的差异?
谢谢!
答案 0 :(得分:3)
假设你的.m文件中有这一行(并且没有任何覆盖方法来直接访问_name)
@synthesize name = _name;
这意味着当您尝试访问它时,属性name
(self.name)将使用变量_name。在这种情况下,self.name
等于_name
但是如果你有名字的动态属性,就像这样:
-(NSString)name{
return @"1234";
}
然后有区别。 self.name
将始终返回1234,但_name可能不等于此值。
示例:
_name = @"555";
NSLog(_name);
NSLog(self.name);
结果:
2012-02-09 14:27:49.931 ExampleApp[803:207] 555
2012-02-09 14:27:49.933 ExampleApp[803:207] 1234
答案 1 :(得分:1)
在提出这样的问题之前,你最好阅读任何目标c属性教程...试试这个http://www.raywenderlich.com/2712/using-properties-in-objective-c-tutorial或其他任何问题。 如果你创建了一个属性,你必须(好吧,应该)通过它访问一个ivar,以便调用setter方法:
- (void)setMyProp:(NSArray *)myProp {
[myProp retain];
[_myProp release];
_myProp = myProp;
}
答案 2 :(得分:0)
第一个是直接访问变量。 第二个是通过财产访问它。
答案 3 :(得分:0)
请考虑以下代码:
NSString *theNameToDisplay = _name;
self.name = @"foo";
NSLog(@"%@", theNameToDisplay);
这可能会导致崩溃,因为当您设置属性时,旧值将被释放,因此theNameToDisplay
成为悬空指针。请注意,对于NSString
,这不一定会发生,尤其是对于文字字符串,但它可以。启用ARC后也不会发生这种情况。
self.name
大致相当于:[[_name retain] autorelease]
因此theNameToDisplay
在方法返回之前仍然有效。
答案 4 :(得分:0)
请参阅有关属性的setter部分的其他答案,这是关于getter:
通常情况下,根据您的喜好,直接使用吸气剂(self.name
)或ivar(_name
,name
,name_
没有区别。
然而,可能会出现某些(半)智能发生在幕后的情况,并且吸气剂隐藏了一些魔力。想象一下这个自定义的getter:
-(NSString*)name
{
if ( _name == nil ) return @"No name set";
return _name;
}
或者想象一下,你重做了你的课程,而_name
ivar被放弃了,转而使用包含更多信息的person
属性,并希望你的代码仍能正常工作:
-(NSString*)name
{
return self.person.name;
}
人们可能会或可能不会喜欢这种方法,但这不属于这个问题的范围。关键是,它可能会发生。因此,更好的选择是始终使用吸气剂。
答案 5 :(得分:-1)
在分配给其他对象方面确实没什么区别但是如果分配以self.name = theNameToDisplay;
之类的方式完成,那将会产生很大的不同,因为theNameToDisplay
中的值会有所不同受@property
属性影响。