Iphone 在Objective-C中使用块作为目标

Iphone 在Objective-C中使用块作为目标,iphone,objective-c,memory-management,objective-c-blocks,Iphone,Objective C,Memory Management,Objective C Blocks,在这个答复中: Lemnar说你可以这样做: id block = [^{NSLog(@"Hello, world");} copy];// Don't forget to -release. [button addTarget:block action:@selector(invoke) forControlEvents:UIControlEventTouchUpInside]; 究竟应该在哪里发布?我想使用它的地方是viewDidLoad方法,因此viewDidU

在这个答复中:

Lemnar说你可以这样做:

id block = [^{NSLog(@"Hello, world");} copy];// Don't forget to -release.

[button addTarget:block
           action:@selector(invoke)
 forControlEvents:UIControlEventTouchUpInside];

究竟应该在哪里发布?我想使用它的地方是viewDidLoad方法,因此viewDidUnload似乎是释放它的地方,但是有没有办法在不创建ivar的情况下释放它?

invoke
方法不是公共的,并且块不打算直接用于此类角色


提交一个增强请求,作为一种解决方法,使用
objc\u implementationWithBlock()
和(IIRC)
class\u addMethod()
创建一个块作为方法,该方法将在目标操作中工作。

必须有某种东西拥有该块对象的所有权,它才能继续工作。Objective-C中的所有权意味着拥有对所拥有对象的引用和引用计数(“保留”)。如果没有对它的引用,您将无法释放它——这意味着泄漏。您需要一个指向对象的变量。按钮本身是拥有其目标的一个很好的候选者,但是
UIButton
s不是这样工作的。我想您可能可以将
UIButton
子类化;否则,是的,您需要在其中一个控制器中创建ivar。

人们可以在此处提交错误报告和增强功能:是否有一个用于块的已记录方法的列表?(像类引用)还是仅仅是内存管理方法?