0

現在のオブジェクトではないターゲットで UITapGesture を作成します。その後、タップするとアプリがクラッシュします。

コントローラ .h を表示:

@interface ViewController : UIViewController
{
    IBOutlet UIImageView *iv;
}
@end

コントローラ .c を表示:

#import "ViewController.h"
#import "Target.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    Target *t = [[Target alloc] init];
    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:t action:@selector(gestureDone:)];
    [iv addGestureRecognizer:tgr];
    [iv setUserInteractionEnabled:YES];
}

@end

ターゲット.h:

@interface Target : NSObject

- (void)gestureDone:(UIGestureRecognizer *)gr;

@end

Target.c:

@implementation Target

- (void)gestureDone:(UIGestureRecognizer *)gr
{
    NSLog(@"Gesture!");
}

@end

(私の XIB ファイルには画像が 1 つしか含まれていません...) 画像をタップすると、クラッシュします。たとえば、インスタンス変数 Target *t をビュー コントローラーに追加した場合 (および viewDidLoad のローカル宣言を削除した場合)、問題は発生しません。そうしないときは、Target で dealloc をオーバーライドし、そこに NSLog を配置して、viewDidLoad の実行が終了するとすぐに Target オブジェクトが fred であることを確認しました。

私は何か間違ったことをしていますか、それとも何か問題がありますか? (通常、initWithTarget:self を使用しているため、この問題に直面していません ...)。

4

2 に答える 2

8

UIGestureRecognizerターゲットを保持しません。ターゲット/アクションのペアを取るほとんどのオブジェクトは、ターゲットを保持しません。これは、Cocoa Fundamentals Guide /Communicating with Objects/The Target-Action Mechanism/The Targetで言及されています。

コントロール オブジェクトは、ターゲットを保持しません (保持すべきではありません)。ただし、アクション メッセージを送信するコントロールのクライアント (通常はアプリケーション) は、ターゲットがアクション メッセージを受信できるようにする責任があります。これを行うには、メモリ管理された環境でターゲットを保持する必要がある場合があります。この予防措置は、デリゲートとデータ ソースに等しく適用されます。

tへの参照をのインスタンス変数に格納するなど、他の方法でターゲットが保持されていることを確認する必要がありますViewController

于 2013-02-13T00:10:09.367 に答える
0

Target のインスタンス変数をクラスに追加して、tそれViewControllerを強力にします。そうすれば記憶に残ります。

于 2013-02-13T08:01:09.593 に答える