2011-01-04 12 views
4

NSDateのカテゴリを構築しました。このカテゴリに属性をカプセル化してデータを保持したいと考えています。しかし、私はこの属性を追加することはできません。Objective-C:カテゴリに属性を追加する

これを達成する方法はありますか?

ありがとうございます。

答えて

12

いくつかのコード:

ファイル名:NSObjectの+ dictionary.h

#import <Foundation/Foundation.h> 
#import <objc/runtime.h> 
@interface NSObject (dictionary) 
- (NSMutableDictionary*) getDictionary; 
@end 

ファイル名:NSObjectの+ dictionary.m今

#import "NSObject+dictionary.h" 
@implementation NSObject (dictionary) 
- (NSMutableDictionary*) getDictionary 
{ 
    if (objc_getAssociatedObject(self, @"dictionary")==nil) 
    { 
    objc_setAssociatedObject(self,@"dictionary",[[NSMutableDictionary alloc] init],OBJC_ASSOCIATION_RETAIN); 
    } 
    return (NSMutableDictionary *)objc_getAssociatedObject(self, @"dictionary"); 
} 

すべてのインスタンス(すべてのクラスの)辞書があります。カスタム属性。 Key-Value Codingで あなたは次のように値を設定することができます。

[myObject setValue:attributeValue forKeyPath:@"dictionary.attributeName"] 

そして、あなたがこのような値を得ることができます。

[myObject valueForKeyPath:@"dictionary.attributeName"] 

も、Interface Builderのとユーザー定義のランタイム属性を持つ素晴らしい作品。

Key Path     Type      Value 
dictionary.attributeName String(or other Type) attributeValue 
+0

この回答は不完全です。この解決策では、プロパティ/ ivarにカテゴリの内部から、例えばクラスメソッドからアクセスすることはできません。 – SpaceDog

4

カテゴリにインスタンス変数を追加することはできません。

ただし、オブジェクトの属性にストレージを追加するには、associative referencesを使用します。複数の属性を追加する必要がある場合は、それぞれの関連参照を追加するのではなく、NSMutableDictionary、CFMutableDictionaryRef、またはNSMapTableに単一の参照を追加して、すべての属性にその参照を使用するほうがよいでしょう。

+0

は、私はこれを読むとわかります、ありがとうございます。 – Oliver

+0

私は、何が言われているのか理解していれば、カテゴリ内ではできません。そうですか? – Oliver

0

属性をクラスに追加する場合は、github.com/libObjCAttrを使用できます。これは、ポッドを経由して、それを追加し、本当に使いやすいです、そして、あなたはそのような属性を追加することができます。

RF_ATTRIBUTE(YourAttributeClass, property1 = value1) 
@interface NSDate (AttributedCategory) 
@end 

そして、コード内を:

YourAttributeClass *attribute = [NSDate RF_attributeForClassWithAttributeType:[YourAttributeClass class]]; 
// Do whatever you want with attribute 
NSLog(@"%@", attribute.property1) 
関連する問題