1. ホーム
  2. objective-c

[解決済み] Objective-Cです。カテゴリ内のプロパティ/インスタンス変数

2022-07-29 17:34:41

質問

Objective-CでCategoryに合成されたプロパティを作成できないので、以下のコードを最適化する方法がわかりません。

@interface MyClass (Variant)
@property (nonatomic, strong) NSString *test;
@end

@implementation MyClass (Variant)

@dynamic test;

- (NSString *)test {
    NSString *res;
    //do a lot of stuff
    return res;
}

@end

test-method は実行時に複数回呼び出され、結果を計算するために多くのことを行っています。通常、合成されたプロパティを使用して、私はメソッドが最初に呼び出されたときにIVar _testに値を格納し、次回からこのIVarを返すだけです。どのように私は上記のコードを最適化することができますか?

どのように解決するのですか。

loreanの方法が有効です。 (注:回答は現在削除されています) というように、ストレージスロットは1つしかありません。 そのため、複数のインスタンスでこれを使用し、各インスタンスに個別の値を計算させたい場合、うまくいかないでしょう。

幸いなことに、Objective-C のランタイムには 関連するオブジェクト というものがあり、まさにあなたが望んでいることを実現できます。

#import <objc/runtime.h>

static void *MyClassResultKey;
@implementation MyClass

- (NSString *)test {
  NSString *result = objc_getAssociatedObject(self, &MyClassResultKey);
  if (result == nil) {
    // do a lot of stuff
    result = ...;
    objc_setAssociatedObject(self, &MyClassResultKey, result, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  }
  return result;
}

@end