我第一次尝试使用目标c块,因为我非常喜欢在Python和Haskell等语言中使用闭包.
我遇到了一个问题,但我希望有人可以提供帮助.
以下是我遇到的问题的最简单版本.
typedef void(^BlockType)(NSString *string);
- (void)testWithtarget:(id)target action:(SEL)action
{
BlockType block = ^(NSString *string) {
[target performSelector:action withObject:data];
};
block(@"Test String"); // Succeeds
[self performSelector:@selector(doBlock:) withObject:block afterDelay:5.0f];
}
- (void)doBlock:(BlockType)block
{
block(@"Test String 2"); // Causes EXC_BAD_ACCESS crash
}
Run Code Online (Sandbox Code Playgroud)
所以它似乎是某种内存管理问题并不让我感到惊讶,但我只是没有知识来看到解决方案.可能我正在尝试的可能甚至不可能.
有兴趣看看其他人的想法:)
我正在使用Xcode 4和LLVM 2作为工作区,其中包含两个项目(A和B).主项目(A)链接到构建静态库的另一个项目(B)的二进制文件.
项目B包含类别,因此为了正确链接到A,我设置了ObjC和all_load链接器标志.然而,这会导致问题,因为我使用的某些库具有不应加载的符号,因此我尝试转移到在项目B的库文件上专门使用force_load.
-force_load $(TARGET_BUILD_DIR)/libB.a
这使得设备在设备上工作,但是在模拟器中应用程序崩溃,因为项目B中的类别未被链接.
知道为什么force_load在设备和模拟器上的工作方式不同吗?
如果您需要更多详细信息,请告诉我们.