Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 构造带块参数的NSInvocation_Objective C_Ios_Memory Management_Objective C Blocks_Nsinvocation - Fatal编程技术网

Objective c 构造带块参数的NSInvocation

Objective c 构造带块参数的NSInvocation,objective-c,ios,memory-management,objective-c-blocks,nsinvocation,Objective C,Ios,Memory Management,Objective C Blocks,Nsinvocation,我正试图将一个块作为参数发送给一个NSInvocation调用的方法(对于上下文,它是由NSInvocationOperation触发的)。调用应该保留参数,它似乎对“常规”对象参数有效,但块的重新计数保持在1 我可以在方法调用中使用它之后释放它,但是如果在调用操作之前解散队列,理论上可能会泄漏它 一些代码: NSInvocationOperation *load = [[NSInvocationOperation alloc] initWithInvocation:loadInvoc]; NS

我正试图将一个块作为参数发送给一个NSInvocation调用的方法(对于上下文,它是由NSInvocationOperation触发的)。调用应该保留参数,它似乎对“常规”对象参数有效,但块的重新计数保持在1

我可以在方法调用中使用它之后释放它,但是如果在调用操作之前解散队列,理论上可能会泄漏它

一些代码:

NSInvocationOperation *load = [[NSInvocationOperation alloc] initWithInvocation:loadInvoc];
NSAssert([loadInvoc argumentsRetained],@"Arguments have not been retained");
[loader release];

NSInvocation *completionInvoc = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(serviceCompletionBlock:afterInvocationCompleted:)]];
[completionInvoc setTarget:self];
[completionInvoc setSelector:@selector(serviceCompletionBlock:afterInvocationCompleted:)];

MFEImageCallback callback = [completionBlock copy];

[completionInvoc setArgument:&callback atIndex:2];
[completionInvoc setArgument:&load atIndex:3];

NSInvocationOperation *completion = [[NSInvocationOperation alloc] initWithInvocation:completionInvoc];
NSAssert([completionInvoc argumentsRetained],@"Completion handler not retaining");
[callback release];
[completion addDependency:load];
我正在使用的块(在
NSManagedObject
子类的访问器方法中定义):

不要调用'retainCount';这是无用的。 如果看不到你的区块的内容,就不可能说。如果您的块实际上是一个静态块,那么复制它不会起任何作用


你看到崩溃了吗?

如果我没有复制块,我会看到崩溃(可能是因为它被分配到堆栈上,并且在调用之前被清除了)。然而,事实证明,如果我释放
回调
块,它不会崩溃。也没有泄漏报告说,块泄漏或其他任何事情。看起来我只是想得太多了。在问题中添加了我的块定义。还有,谢谢你的帮助!您从哪里获得completionBlock?您是否使用getArgument:atIndex:获取它?
^(UIImage *image,NSError *err){
    [self setValue:image forKey:key];
}