Aar*_*non 2 iphone memory-management objective-c objective-c-blocks
我第一次尝试使用目标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)
所以它似乎是某种内存管理问题并不让我感到惊讶,但我只是没有知识来看到解决方案.可能我正在尝试的可能甚至不可能.
有兴趣看看其他人的想法:)
该块不会被保留,因为它仅存在于堆栈中.如果要在当前堆栈的范围之外使用它(即因为您正在使用afterDelay:),则需要复制它.
- (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 copy] afterDelay:5.0f];
}
- (void)doBlock:(BlockType)block
{
block(@"Test String 2");
[block release];
}
Run Code Online (Sandbox Code Playgroud)
但是,由于您在方法调用中进行复制和释放,因此有点危险,但在这种特定情况下,您需要这样做.