0

私が構築しているフレームワークで公開しているヘッダーの @property のセッターを非表示にしようとしています:

//File: X.h
@interface X 
@property (nonatomic,readonly, strong) NSString* identifier;
@end

このインターフェイスにいくつかのメソッドを追加するカテゴリがあります。

//File: X+implementation.h
@interface X (Implementation)
...
@end

このカテゴリは、私のプロジェクトでのみアクセスできます。つまり、フレームワークを構築しているときに公開していません。多くのソースは、readwrite プロパティを使用してインターフェイス拡張を追加する必要があると言っていますが、私のカテゴリは "Xm" の readwrite 定義を参照できないため、これは役に立ちません。そこで、カテゴリ宣言に追加することを考えました:

//File: X+implementation.h
@interface X ()
@property (nonatomic, readwrite, strong) NSString* identifier;
@end
//same file
@interface X (Implementation)
...
@end

これはコンパイルされますが、[X setIdentifier:]: unrecognized selector sent to instance が表示されます

Xm で拡張機能を複製して、Xm でセッターを手動で作成し、変数を手動で @synthesize しようとしましたが、どれも機能していないようです。この場合、どうすればよいですか?

4

2 に答える 2

1

Xh で、通常どおり読み取り専用プロパティを宣言します。

@interface X : XSuperclass
@property (nonatomic,readonly, strong) NSString* identifier;
@end

Xm では、クラス拡張でプロパティを readwrite として再定義します。これにより、プロパティは引き続き自動合成の対象となり、setter の実装が提供されます。

@interface X ()
@property (nonatomic,readwrite, strong) NSString* identifier;
@end

@implementation X
// Your class's main implementation
@end

カテゴリの実装ファイルで、カテゴリにのみ表示される別のカテゴリを宣言しますが、実装はしません。そこでプロパティを readwrite として再宣言します。

@interface X (CategoryPrivate)
@property (nonatomic,readwrite, strong) NSString* identifier;
@end

@implementation X (Category)

// your category impl here
- (void)methodName {
    self.identifier = @"id";
}

@end

これには、readwrite プロパティの宣言が重複しているため、保守性の問題があります。ただし、これを実装する他の方法よりも全体的にコードが少なくて済み、混乱の可能性があります。

于 2013-09-06T03:08:39.570 に答える
0

プロパティを読み取り専用にしたい場合は、そのためにカテゴリを使用する必要はありません。

ヘッダー:

@interface X : NSObject

@property (nonatomic, strong, readonly) NSString *identifier;

@end

実装:

@interface X ()

@property (nonatomic, strong, readonly) NSString *identifier;

@end

@implementation X

//.. your implementation goes here

@end
于 2013-09-05T21:40:31.547 に答える