2009-03-28 7 views
1

で@synthesizeを使用して生成しました私。また、ドキュメントによれば、setterにはスレッドセーフティコードが組み込まれています。拡張プロパティは、私は@propertyはこのように宣言していたとのObjective-C

ここで、setSomeObject:メソッドにいくつかのコードを追加したいとします。既存のものを@synthesizeから拡張できる方法はありますか?私はそれが自動生成するスレッドセーフティコードを再利用できるようにしたい。あなたはこのコードを使用してメソッドを拡張することができます

-(void)setSomeObject:(NSObject *)anObject { 
    [anObject retain]; 
    [someObject release]; 
    someObject = anObject; 
} 

または

-(void)setSomeObject:(NSObject *)anObject { 
    if(someObject != anObject) { 
     [someObject release]; 
     someObject = [anObject retain]; 
    } 
} 

:何@synthesize

答えて

1

は同等です。

しかし、あなたが言ったように、このコードはスレッドセーフではない可能性があります。

スレッドの安全性については、NSLockまたは@synchronizedunwesenのおかげでこれを指摘してください)をご覧ください。

+0

@synchronizedはおそらくNSLockよりも優れています。 –

+0

@unwesen:そうです。なぜ私はそれを考えなかったのですか? –

+0

KVOの呼び出しを忘れないでください: [self willChangeValueForKey:@ "someObject"]; ... [自己didChangeValueForKey:@ "someObject"]; –

3

あなたは

@interface ClassName() 

// Declared properties in order to use compiler-generated getters and setters 
@property (nonatomic, strong <or whatever>) NSObject *privateSomeObject; 

@end 

(あなた.mファイルでこれを入れて)、合成された「プライベート」プロパティを定義し、手動でClassName.h@implementation一部の「公共」の部分にゲッターとセッターを定義することができます)このように、

- (void) setSomeObject:(NSObject *)someObject { 
    self.privateSomeObject = someObject; 
    // ... Additional custom code ... 
} 

- (NSArray *) someObject { 
    return self.privateSomeObject; 
} 

あなたは今いつものように、例えばsomeObject「プロパティ」にアクセスすることができますobject.someObject。また、自動的に生成されたretain/release/copyの利点を得て、ARCとの互換性があり、スレッドセーフがほとんど失われません。

関連する問題