objective-c - 如何在对象内使用 objc_setAssociatedObject/objc_getAssociatedObject?

标签 objective-c categories

如果我在类别实现中使用 objc_setAssociatedObject/objc_getAssociatedObject 将模拟实例变量存储在 setter 方法中,我将如何访问 getter 方法中的键,因为在 setter 方法中声明的任何变量都将超出 getter 的范围方法?

编辑:澄清一下,如果我要使用以下模式,我应该在哪里声明 STRING_KEY 以便我可以在 setter 和 getter 方法中使用它。

@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

关于objective-c - 如何在对象内使用 objc_setAssociatedObject/objc_getAssociatedObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846218/

相关文章:

objective-c - 使用 ProcessSerialNumber 获取 NSRunningApplication

objective-c - iOS Landscape 和 Portrait Delegate 混淆

css - 如何在 ExpressionEngine 中显示各种大小的 vimeo 视频(新视频将以前的视频推到新的大小)

jquery-autocomplete - 同时使用类别和重音折叠的 jQuery UI 自动完成

objective-c - 使用 Growl on Lion 所需的代码签名授权 key 是什么?

objective-c - 使用 NSURLRequest 的代理

objective-c - Objective-C 的命名空间约定

magento - 添加启用所见即所得的类别属性

iphone - 使用类别扩展 UIImageView 会在 self.dispatchQueue 上引发错误

php - 将 body 类添加到类别及其所有子类别 |吴商务