如果name是NSString,则_name和self.name之间有什么区别

时间:2012-02-09 11:13:55

标签: objective-c setter getter

如果我致电

,会有什么干扰
NSString *theNameToDisplay = _name;

NSString *theNameToDisplay = self.name;

我知道这可能是一个愚蠢的问题,但我看到两个版本都使用了很多,我没有发现输出的差异?

谢谢!

6 个答案:

答案 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(_namenamename_没有区别。

然而,可能会出现某些(半)智能发生在幕后的情况,并且吸气剂隐藏了一些魔力。想象一下这个自定义的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属性影响。