【发布时间】:2025-12-06 05:50:02
【问题描述】:
据我了解,块就像一个对象,因为您可以向它发送复制或发布消息,例如:
[myBlock copy];
但是,每当我这样做或释放一个块时,我都会得到 EXC_BAD_ACCESS。
如果我使用块函数,一切都会按预期工作,例如:
Block_copy(myBlock);
我认为释放和复制块的方式是相同的?
这不是什么大问题,但是如果我有一个属性(副本)是一个Block,我必须自己编写setter方法,这有点烦人。
例如:带属性:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock;
设置cancelledBlock时导致EXC_BAD_ACCESS
但如果我这样做:
//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);
//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well
- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
if (cancelledBlock == aCancelledBlock) {
return;
}
void (^oldValue)(void) = cancelledBlock;
cancelledBlock = Block_copy(aCancelledBlock);
Block_release(oldValue);
}
没有 EXC_BAD_ACCESS,一切正常运行。
【问题讨论】:
-
您应该只发布您之前保留或复制的内容。
-
我知道,正如我在我的问题中所说,尝试执行
[myBlock copy]会给出 EXC_BAD_ACCESS,但Block_copy(myBlock)不会 -
你能给我们看一个完整的例子吗?
-
没有真正的例子,我使用块的地方都是一样的。
-
复制的块属性工作得很好。如果您的情况不是这样,您应该创建并上传一个我们可以尝试的简单演示项目。
标签: iphone objective-c exc-bad-access objective-c-blocks