我正在学习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的目的是什么?感谢
答案 0 :(得分:1)
self
可让您更明确地了解信息的来源。
例如,您可以使用以下方法:
- (BOOL)isEqual:(id)other {
return [self class] == [other class] && [self info] == [other info];
}
此外,根据您的媒体资源的内存语义,如果您执行self.info = someInfoObject
之类的操作,则综合属性方法将为您管理retain
和release
来电。
拥有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下保留/释放,进行延迟初始化,无论你在方法中写什么)自己)。