Objective-C:id和不透明指针id有什么区别?

时间:2011-12-09 15:47:09

标签: objective-c

id - 变量,我可以指定一个块并在之后调用它;使用不透明的指针ID,这不起作用(EXC_BAD_ACCESS)。

在RestKit中,userData-object是一个“不透明指针”;现在,我想为它分配一个块变量,在请求完成后调用该块。但由于这个EXC_BAD_ACCESS它不起作用。有没有机会使用这个不透明的指针来为它分配块?

非常感谢!

修改

// this works
id testId = ^{
   NSLog(@"hello");
};

testId();

// this doesn't - but it's important to know RestKit
void (^postNotification)(void) = objectLoader.userData // EXC_BAD_ACCESS
postNotification();

objectLoader的类型为RKObjectLoaderRKRequest的子类),API说的是userDataAn opaque pointer to associate user defined data with the request.

1 个答案:

答案 0 :(得分:2)

你需要向我们展示你是如何创建块并将其分配给userData的,但我的猜测是你没有复制块并且它超出了范围,如下所示:

objectLoader.userData = ^{ ... };

在堆栈上创建块。这意味着当封闭它的复合语句(例如函数)结束时,该块不再有效。如果您希望块存活,则需要将其复制到堆中:

objectLoader.userData = [^{ ... } copy];