11

.mクラスの実装 ( ) ファイルで宣言されているクラスの名前のないカテゴリ内にそれらを配置することにより、クラスのプライベート プロパティを宣言する可能性について知っています。それ私がやりたいことではありません。

そのクラスにいくつかの機能を追加するクラスの名前付きカテゴリを扱っています。この機能のために、自分のカテゴリで使用するプライベート プロパティがあると非常に役立ちます。そのため、これを実現する通常の方法 (上記) はうまくいかないようです。それともそうですか?教えてください!

4

1 に答える 1

24

カテゴリの実装ファイル内で、別のカテゴリを宣言して のようMyCategoryName_Privateに呼び出し、そこでプライベート プロパティを宣言します。関連オブジェクトを使用して-propertyNameおよびメソッドの実装を提供します。-setPropertyName:

たとえば、実装ファイルは次のようになります。

#import "SomeClass+MyCategory.h"
#import <objc/runtime.h>

@interface SomeClass (MyCategory_Private)

@property (nonatomic, strong) id somePrivateProperty;

@end

@implementation SomeClass (MyCategory_Private)

static void *AssociationKey;

- (id)somePrivateProperty 
{
    return objc_getAssociatedObject(self, AssociationKey);
}

- (void)setSomePrivateProperty:(id)arg
{
    objc_setAssociatedObject(self, AssociationKey, arg, OBJC_ASSOCIATION_RETAIN);
}

@end

@implementation SomeClass (MyCategory)

// implement your publicly declared category methods

@end
于 2013-01-19T10:29:10.963 に答える