Если бы я использую 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
Объявите статическую переменную, чтобы вы могли использовать ее адрес в качестве ключа. Вызов 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
Объявите статическую (компиляционную unit-scope) переменную на верхнем уровне исходного файла. Это может помочь сделать ее осмысленной, что-то вроде этого:
static NSString *MYSimulatedString = @"MYSimulatedString";