1

これは、クラスの1つの実装ファイルにあるものです...

コード設定 #1

@interface MyViewController (PrivateMethods)
- (NSString *)myPrivateMethod;
@end

@implementation MyViewController
- (void)viewDidLoad
{
    NSString *myString = [self myPrivateMethod];
    NSLog(@"%@", myString);
}

- (NSString *)myPrivateMethod
{
    return @"someString";
}
@end

このコードでは、すべてが機能し、「someString」がログに記録されます。

しかし、私のコードはどういうわけか異なって見えるべきではありませんか? 私は実際にそのカテゴリを誤って使用しています (何かをコピー/貼り付けしたのですが、「PrivateMethods」がそこにあることに気づきませんでした。クラス拡張を使用するつもりでした)。

私のコードは実際には次のいずれかのように見えるべきではありません:

コード設定 #2

@interface MyViewController ()
- (NSString *)myPrivateMethod;
@end

@implementation MyViewController
....

または:

コード設定 #3

@interface MyViewController (PrivateMethods)
- (NSString *)myPrivateMethod;
@end

@implementation MyViewController (PrivateMethods)
....

この状況で起こっていることの背後にあるニュアンスは何ですか? コード設定 #1 とコード設定 #2 の違いは何ですか?

編集:セットアップ#3に関する質問

このように設定すると、何が達成されますか? これは「うまくいく」でしょうか?

@interface MyViewController (PrivateMethods)
- (NSString *)myPrivateMethod;
@end

@implementation MyViewController
- (void)viewDidLoad
{
    NSString *myString = [self myPrivateMethod];
    NSLog(@"%@", myString);
}
@end

@implementation MyViewController (PrivateMethods)
- (NSString *)myPrivateMethod
{
    return @"someString";
}
@end
4

1 に答える 1

2

セレクターは、実行時に同じフラットな名前空間にプッシュされるだけです。コンパイラは、セレクターがカテゴリで定義されたメソッドであることを区別するためのコードを追加しません (メッセージングの場合)。すべてフラットです。

カテゴリのシンボルは別の方法でエクスポートされますが、一度読み込まれるとランタイムには問題になりません。

通常、セットアップ #3 を使用する必要があります。メソッドがカテゴリで宣言されている場合は、カテゴリの で定義する必要があります@implementation。コンパイラは時折あなたを救うでしょう、そしてそれはより純粋な構造です. (もちろん、すべてのメソッドがカテゴリに属しているわけではありません)。同様に、 の宣言@interfaceは対応する@implementationで定義する必要があり、クラス継続 ( @interface MONClass ()) の宣言の定義もプライマリに表示する必要があります@implementation

@implementation MONClass
// add your @interface MONClass definitions here
// also add your @interface MONClass () definitions here
@end

更新された質問

はい、それはうまくいきます。必要なのは#import、 を含むヘッダーだけです@interface MyViewController (PrivateMethods)。私は実際にいくつかのクラスでこれを行って、トピックごとに分類/整理しています。

通常、「プライベート メソッド」はクラスの継続で宣言されますが、そうする必要はありません (ivars/プロパティ OTOH…)。

于 2012-09-20T18:42:22.193 に答える