1

基礎クラス (NSString など) の .m ファイルが利用できないため、同じクラスで宣言されたカテゴリの .m ファイル内で拡張子を宣言できるかどうかを考えていました。内部でインスタンス変数を使用しないプライベート メソッドの作成に成功しました。しかし、インターフェイス内で宣言された iVar にアクセスしようとすると、問題が発生しました。
※これは特に目的はなく、ただ試してみただけです。

私がしたことは、次のカテゴリを宣言することでしたNSString:

NSString+TestInterface.h

@interface NSString (TestInterface)
@end

NSString+TestInterface.m

@interface NSString () {

    NSString *myVar;
}
@property (strong) NSString *myVar;
-(void)myPrivateMethod;
@end


@implementation NSString (TestInterface)
-(void)myPrivateMethod{
    myVar=@"random";
//    [self setValue:@"check" forKey:@"myVar"];

    NSLog(@"Private %@",myVar);
//    NSLog(@"Private %@",[self valueForKey:@"myVar"]);
}

@end

この方法で実行すると、次のコンパイラ エラーが発生します。

アーキテクチャ x86_64 の未定義シンボル:
"_OBJC_IVAR_$_NSString.myVar"、参照元: -[NSString(TestInterface) myPrivateMethod] in NSSTring+TestInterface.o ld: アーキテクチャ x86_64 のシンボルが見つかりません

誰かが何が起こっているのか教えてもらえますか?

4

2 に答える 2

2

クラスの元の主要な実装が存在する同じ変換単位 (ファイル) で、クラス拡張を使用して新しいインスタンス変数のみを定義できます。これは、インスタンス変数を持たないクラスに効果的に追加できないことを意味します。のソースコード。

于 2013-06-12T09:52:19.677 に答える