我最近被“分配”到一段代码,其中以下标有#warning memory leak
- (void)aMethodWithCallback:(BlockType)completedBlock {
/* Do stuff */
completedBlock = ^(Class1 *obj, NSError *error) {
/* Do stuff */
#warning memory leak
if (completedBlock) {
completedBlock(obj, error);
}
};
[self callAnotherMethodWithCallback::completedBlock];
}
我不知道如何处理它,创建一个名称作为输入块的块看起来很奇怪,但似乎有效。 为什么上述代码有危险?
修改的 ARC已启用。
将代码更改为此代码,它似乎不再泄漏:
- (void)aMethodWithCallback:(BlockType)completedBlock {
/* Do stuff */
BlockType completedBlock2 = ^(Class1 *obj, NSError *error) {
/* Do stuff */
if (completedBlock) {
completedBlock(obj, error);
}
};
[self callAnotherMethodWithCallback::completedBlock2];
}
答案 0 :(得分:1)
- (void)aMethodWithCallback:(BlockType)completedBlock {
id obj = nil;
NSError error = nil;
/* make your stuff with obj and error*/
if (completedBlock)
completedBlock(obj, error);
[self callAnotherMethodWithCallback::completedBlock];
}
或者每次调用方法时都会重写变量。
答案 1 :(得分:0)
据我所知,您提供的小代码片段没有泄漏。如果存在内存泄漏,则不在您提供的代码片段中,因为以下程序在使用ARC编译时会在没有问题的仪器下运行:
void func2(void (^block)(void));
void func1(void (^block)(void))
{
block = ^() {
if (block)
block();
};
func2(block);
}
void func2(void (^block)(void)) {
if (block)
block();
}
int main()
{
func1(^{
NSLog(@"Callback");
});
}
要么我错过了什么,要么你被“分配”的那段代码是假的。
注意:我会确保所引用的方案启用了ARC。如果没有启用ARC,那么肯定 是该代码中的泄漏。