Objective-C:使用Self访问局部变量

时间:2013-09-23 19:08:37

标签: objective-c

我正在学习Objective-C而且我对 self 感到困惑,所以这里是代码: 界面:

@interface Person : NSObject
{
float HeightInMeters;
int WeightInKilos;
}
@property float HeightInMeters;
@property int WeightInKilos;
- (float) BodyIndex;

@end

没有自我的实施:

@implementation Person
@synthesize HeightInMeters,WeightInKilos;
-(float)BodyIndex
{
    float h=HeightInMeters;
    float w=WeightInKilos;
    return w/(h*h);
}
@end
使用自我

进行实施
@implementation Person
@synthesize HeightInMeters,WeightInKilos;
-(float)BodyIndex
{
    float h=[self  HeightInMeters];
    float w=[self  WeightInKilos];
    return w/(h*h);
}
@end

所以这里有一个问题:无论有没有自我,两个代码都运行正常,那么使用self的目的是什么?感谢

4 个答案:

答案 0 :(得分:1)

self可让您更明确地了解信息的来源。

例如,您可以使用以下方法:

- (BOOL)isEqual:(id)other {
  return [self class] == [other class] && [self info] == [other info];
}

此外,根据您的媒体资源的内存语义,如果您执行self.info = someInfoObject之类的操作,则综合属性方法将为您管理retainrelease来电。

拥有self标识符使其更清晰。如果您熟悉Java或C ++。 self有点类似于this

答案 1 :(得分:0)

您可以删除代码上的@synthesize。 如果你删除它,你可以使用self或_:

访问你的@property
@property float heightInMeters;

_heightInMeters或self.heightInMeters

Here一个链接,用于解释如何正确使用self以及它是什么;)

答案 2 :(得分:0)

当您使用[self HeightInMeters]时,您正在访问名为HeightInMeters属性。当您使用HeightInMeters时,由于您编写@synthesize的方式,您正在访问该属性的支持字段。

有关属性的详情,请参阅Apple docs

答案 3 :(得分:0)

通过访问器方法(这里真正不同)是一种与访问实例变量完全不同的操作。如果你不调用该方法,该方法中的代码将不会运行,因此不会发生任何副作用(通过KVO通知,在非ARC下保留/释放,进行延迟初始化,无论你在方法中写什么)自己)。