Как я использую objc_setAssociatedObject/objc_getAssociatedObject в объекте?

Если бы я использую objc_setAssociatedObject/objc_getAssociatedObject в реализации категории для хранения моделируемой переменной экземпляра в методе установщика, как я получил бы доступ к ключу в методе получателя, так как какие-либо переменные, объявленные в методе установщика, выйдут за рамки метода получателя?

Править: Разъясниться, если я должен был использовать следующий шаблон, где я должен объявить STRING_KEY так, чтобы я мог использовать его и в методе set и в методе получателя.

@interface NSView (simulateVar)
-(void)setSimualtedString:(NSString *)myString;
-(NSString *)simulatedString;
@end

@implementation NSView (simulateVar)

-(void)setSimualtedString: (NSString *)myString
{
    objc_setAssociatedObject(self, &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN);
}

-(NSString *)simulatedString
{
    return (NSString *)objc_getAssociatedObject(self, &STRING_KEY);
}

@end
65
задан leo 17 May 2010 в 01:56
поделиться

2 ответа

Объявите статическую переменную, чтобы вы могли использовать ее адрес в качестве ключа. Вызов objc_setAssociatedObject принимает void *, и фактически используется только адрес вашей статической переменной, а не содержимое NSString ... что только тратит память.

Вам просто нужно добавить:

static char STRING_KEY; // global 0 initialization is fine here, no 
                        // need to change it since the value of the
                        // variable is not used, just the address
62
ответ дан 24 November 2019 в 15:19
поделиться

Объявите статическую (компиляционную unit-scope) переменную на верхнем уровне исходного файла. Это может помочь сделать ее осмысленной, что-то вроде этого:

static NSString *MYSimulatedString = @"MYSimulatedString";
16
ответ дан 24 November 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: