Objective-C クラス拡張 質問する

Objective-C クラス拡張 質問する

私は Objective-C プログラマーとしては比較的新しい (Java の経験は 4 年) ので、クラス拡張をいつ使用すればよいのか理解するのに苦労しているようです。私が理解している限りでは (間違っていたら訂正してください)、カテゴリと拡張の主な違いは、拡張ではメインの実装内でメソッドを実装することが求められるのに対し、カテゴリでは別の実装で実装できるという点です。また、拡張機能は主にプライベート メソッドに使用されているようです。

これが私の最初の質問です。クラス拡張を使用してプライベート メソッドを宣言することと、まったく宣言しないことの違いは何ですか (どちらの場合も実行時にコンパイルされるようです)? (例 1 と 2)

例1

@interface Class()
-(void) bar;
@end

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end

例2

@implementation Class
-(void) foo {
    [self bar];
}

-(void) bar {
    NSLog(@"bar");
}
@end

2 番目の質問: 拡張機能内で ivar を宣言することと、実装内で直接宣言することの違いは何ですか? (例 3 と 4)

例3

@interface Class() {
    NSArray *mySortedArray;
}
@end

@implementation Class
@end

例4

@implementation Class
NSArray *mySortedArray;
@end

コーディング規則について最後に質問があります。変数名の前にアンダースコア (_) を置く必要があるのはどのような場合ですか?

ありがとう

ベストアンサー1

クラス拡張のメソッド

プライベート メソッドを宣言する必要がないということは、かつてはありませんでした。最近まで、プライベート メソッドをどこかで宣言する必要があり、ほとんどの人はクラス拡張を選択していました。Xcode 4.4 (確か) 以降、コンパイラーは、その実装内でどのメソッドがプライベートになるのかを判断できるほど賢くなり、他の場所で宣言する必要がなくなりました。

クラス拡張の変数

例 3 と 4 については、注意してください。クラス拡張内では、変数はそのクラスのインスタンス変数です (例 3)。例 4 は、グローバル変数を宣言しています (C のグローバル変数セマンティクスに従っているため)。プライベート インスタンス変数の場合は、例 3 に従ってください。

コーディング規約

コーディング規約に関しては、アンダースコアを使用するかどうかは開発者/チームの判断次第です。私たちのチームはm_プライベートインスタンス変数にアンダースコアを使用しています。Appleはドキュメントは示唆するアンダースコアを使用します(これは、合成プロパティの基礎となるインスタンス変数の命名スタイルです)。重要なのは、コード全体で一貫性を保つためです。

おすすめ記事