-2

私はObjective-Cを学んでおり、自分自身について混乱しているので、ここにコードがあります:インターフェース:

@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、合成されたプロパティ メソッドのようなことを行うと、retainとのrelease呼び出しが管理されます。

識別子selfがあると、より明確になります。Java または C++ に精通している場合。selfに多少似ていthisます。

于 2013-09-23T19:13:35.423 に答える
0

コードで @synthesize を削除できます。これを削除すると、 @property に self または _ でアクセスできます:

@property float heightInMeters;

_heightInMeters または self.heightInMeters

ここでは、self を正しく使用する方法とそれが何であるかを説明するリンクを示します ;)

于 2013-09-23T19:15:25.350 に答える
0

を使用すると、という名前のプロパティ[self HeightInMeters]にアクセスしています。を使用するだけで、そのプロパティのバッキング フィールドにアクセスしているのは、.HeightInMetersHeightInMeters@synthesize

プロパティの詳細については、Apple ドキュメントを参照してください。

于 2013-09-23T19:16:03.067 に答える
0

アクセサー メソッドを通過すること (ここで実際に異なる点) は、インスタンス変数へのアクセスとは根本的に異なる操作です。メソッドを呼び出さない場合、そのメソッドのコードは実行されないため、その副作用は発生しません (KVO を介した通知、非 ARC での保持/解放、遅延初期化の実行、メソッドに記述したものは何でも)あなた自身)。

于 2013-09-23T19:19:34.363 に答える