4
この答えで

でTargetActionとしてブロックを使用した:正確には解放されなければならないのObjective-C

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

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

Can I pass a block as a @selector with Objective-C?

Lemnarは、あなたがこれを行うことができます言いましたか?どこでそれを使用したいのですか?viewDidUnloadはviewDidLoadメソッド内にありますので、viewDidUnloadはそれを解放する場所のようですが、ivarを作成せずにreleaseする方法はありますか?

答えて

8

これはサポートされていません。 invokeメソッドはパブリックではなく、ブロックはそのようなロールで直接使用するためのものではありません。

改善策を提出し、回避策として、objc_implementationWithBlock()および(IIRC)class_addMethod()を使用して、ターゲットアクションで動作するブロック方式を作成します。

+1

http://developer.apple.com/bugreporter/ – logancautrell

+0

ブロックのドキュメント化されたメソッドのリストはありますか? (クラス参照のように)または単にメモリ管理メソッドですか? –

+0

ちょうどメモリ管理方法.... – bbum

2

何かがそのブロックオブジェクトの所有権を奪わなければならないことがあります。 Objective-Cの所有権とは、所有オブジェクトへの参照と参照カウント(「保持」)を持つことを意味します。それを参照せずにリリースすることはできません。これはリークを意味します。オブジェクトを指すどこかの変数が必要です。ボタン自体はターゲットを所有するための良い候補になりますが、UIButtonはそのようには機能しません。おそらくサブクラス化できると思いますUIButton、おそらく;さもなければ、コントローラの1つにivarを作成する必要があります。

関連する問題