-2

我正在学习 Objective-C,我对self有一个困惑,所以这里是代码:接口:

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

@end

没有self的实现:

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

使用self的实现:

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

所以这里的问题是:有或没有self两种代码都可以正常工作,那么使用 self 的目的是什么?谢谢

4

4 回答 4

1

self允许您更明确地了解信息的来源。

例如,您可以有这样的方法:

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

此外,根据您的属性的内存语义,如果您执行诸如self.info = someInfoObject综合属性方法之类的操作,则会为您管理retainrelease调用。

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

于 2013-09-23T19:13:35.423 回答
0

您可以在代码中删除 @synthesize。如果您删除它,您可以使用 self 或 _ 访问您的 @property:

@property float heightInMeters;

_heightInMeters 或 self.heightInMeters

这里有一个链接来解释如何正确使用 self 以及它是什么;)

于 2013-09-23T19:15:25.350 回答
0

当您使用时,您[self HeightInMeters]正在访问名为HeightInMeters. 当您刚刚使用时HeightInMeters,您正在访问该属性的支持字段,因为您是如何编写@synthesize.

Apple 文档中查看更多属性。

于 2013-09-23T19:16:03.067 回答
0

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

于 2013-09-23T19:19:34.363 回答