4

私はとても単純な何かにつまずいているとは信じられません:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button setTitle:@"Tap me" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];

        button.frame = CGRectMake(50, 50, 120, 60);
        [self.view addSubview:button];

    }
    return self;
}

-(void)test {
    NSLog(@"Test");
}

ボタンを押すとクラッシュし、unrecognized selector sent to instanceエラーが発生します。

誰かが私がここで間違っている可能性があることを知っていますか?

編集-エラーメッセージ:

-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30'

編集-それがどのように提示されるか(ARC):

DemoViewController *demoVC = [[DemoViewController alloc] init];
    [self.window addSubview:demoVC.view];

    [self.window makeKeyAndVisible];
4

4 に答える 4

10

ARCを使用している場合、demoVC.viewは、このように初期化するのではなく、関数が終了した直後に解放されます。

DemoViewController *demoVC = [[DemoViewController alloc] init];

demoVCの周りに強力なプロパティを作成し、次のように初期化します

self.demoVC = [[DemoViewController alloc] init];
于 2012-07-01T19:29:37.323 に答える
3

エラーメッセージは、ボタンが押される前にView Controllerの割り当てが解除されていることを示しています(ほとんどの場合)。(これは、メッセージがNSStringに送信されていることを示しています。これは、おそらくView Controllerが使用していたメモリを占有しています。)

これを追い詰める最も簡単な方法は、ゾンビを使用してこれを確認し、オブジェクトの割り当てが早期に解除されている理由を特定することです。

編集:プレゼンテーションコードに基づいて、たとえば、ViewControllerへの参照を保持するインスタンス変数を作成する必要があります。viewDidLoadまた、将来的に他の問題を回避するために、ボタン初期化コードを移動することもできます。(または、ペン先にボタンを接続するだけです!)

于 2012-07-01T19:24:01.047 に答える
-1

コードを使用してUIコンポーネントを追加する場合は、viewDidLoadまたはloadView(xibファイルを追加しない場合)のオーバーライドメソッドを追加する必要があります。

また、送信者のパラメータを追加する必要があります(これは推奨事項です)

ex)-(void)test:(id)sender

そして、このようにターゲットを追加します... [button addTarget:self action:@selector(test :) forControlEvents:UIControlEventTouchUpInside]

于 2012-07-01T22:31:44.997 に答える
-2

コードのどこかでNSStringの「test」メソッドを呼び出すことができます。

于 2012-07-01T19:23:48.200 に答える