gpt4 book ai didi

iphone - 在 Objective C block 中执行选择器

转载 作者:行者123 更新时间:2023-12-03 20:34:51 26 4
gpt4 key购买 nike

我第一次尝试使用 Objective C block ,因为我非常喜欢在 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
}

所以这似乎是某种内存管理问题,这并不让我感到惊讶,但我只是不具备了解解决方案的知识。可能我正在尝试的事情甚至不可能实现。

有兴趣看看其他人的想法:)

最佳答案

该 block 不会被保留,因为它只存在于堆栈中。如果您想在当前堆栈范围之外使用它(即因为您正在使用 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];
}

这有点偶然,因为您是在方法调用之间复制和释放,但在这种特定情况下您需要这样做。

关于iphone - 在 Objective C block 中执行选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4621721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com