我有一个NSURLConnection的类别,我使用相关对象来扩展类以保持对我的自定义类的引用,以便稍后在委托并稍后将调用转发给真实目标时可以在其他上下文中获得。这样我就可以在运行时的某些点修改所需的数据。
但是由于某些事情过去正常工作的原因,突然objc_getAssociatedObject返回nil,这意味着我没有收回我的相关对象,整个过程就停止了。
我的代码:
static void* KEY_CONNECTION_MYCLASS;
static MyClass* GetConnectionMyClass(NSURLConnection* connection)
{
return (MyClass*)
objc_getAssociatedObject(connection, KEY_CONNECTION_MYCLASS);
}
static void AttachConnectionMyClass(NSURLConnection* connection, MyClass* myClass)
{
objc_setAssociatedObject(connection,
&KEY_CONNECTION_MYCLASS,
myClass,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
以及如何从其他静态函数访问上述函数。
当我设置关联对象时:
NSURLConnection* connection = (NSURLConnection*) self;
AttachConnectionMyClass(connection, myClass);
获取相关对象:
NSURLConnection* connection = (NSURLConnection*)self;
MyClass* myClass = GetConnectionMyClass(connection);
if (myClass)
{
NSLog(@"MyClass is NOT NIL");
}
else
{
NSLog(@"MyClass is NIL");
}
结果总是" MyClass是NIL"。正如我所提到的那样,这种方式正常运行并且没有任何理由让我停下来。
您怎么看?
答案 0 :(得分:2)
设置和获取对象时使用的是不同的键。
设置时请注意&
,但获取时请注意。你应该在两种情况下使用。
一个好的做法是像这样定义密钥:
static void* KEY_CONNECTION_MYCLASS = &KEY_CONNECTION_MYCLASS;
这样,你的拼写错误就不重要了。但修复拼写错误很好。