3

タイトルの通りです。これを行っても、すぐに問題はありません。

- (void) associateSelector:(SEL)value withPointer:(void*)key
{
    objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}

それを使用することに注意する正当な理由はありますか?

4

2 に答える 2

6

ドキュメントで明示的にサポートされていない方法でAPIを使用しています。したがって、OS X/iOSの次のアップデートで壊れたときに文句を言うことはできません。それが注意すべき理由の1つです。

ドキュメントにはOBJC_ASSOCIATION_ASIGN、弱参照を設定すると書かれています。これは、ガベージコレクションの状況では重要なことを意味するため、注意してください。

公式にサポートされている方法で物事を行う方法があれば、私はそれを好むでしょう。あなたの場合、を使用NSStringFromSelectorするとすぐにコードがサポートされます。

于 2011-05-13T23:52:33.137 に答える
3

それは悪い考えです。Yuji が言うように、ドキュメントで定義されている API に違反しています。本当に任意の値を保存したい場合は、ラップNSValueしてOBJC_ASSOCIATION_RETAIN_NONATOMIC.

- (void) associateSelector:(SEL)value withPointer:(void*)key {
    NSValue *nsvalue = [NSValue valueWithBytes:&value objcType:@encode(SEL)];
    objc_SetAssociatedObject(self, key, nsvalue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
于 2011-05-13T23:58:53.307 に答える