4

キーボードの戻るボタンが押されると、メソッドが呼び出されます。整数を返す別のメソッドを呼び出した後、その整数に基づいてメッセージが作成されます。メッセージは UIAlterView に渡され、ユーザーに表示されます。アラートにはオプションがありません (そのため、デリゲートを呼び出していません)。何が起こったかをユーザーに通知するだけです。

編集:以下は完全な方法です(以前は部分的に表示されていました)。の前のすべてをコメントアウトし、UIAlertViewメッセージを渡す代わりに文字列 @"test" を置き換えると、アラートが正常に表示されます。構造体でメモリを正しく処理していませんか?

- (IBAction)joinButton {
    struct userInfo localUser;

    [emailAddress resignFirstResponder];

    //convert textField text to char array in structure
    localUser.firstName = [self convertStringtoCharArray:firstName.text];
    localUser.lastName = [self convertStringtoCharArray:lastName.text];
    localUser.username = [self convertStringtoCharArray:username.text];
    localUser.email = [self convertStringtoCharArray:emailAddress.text];
    localUser.ipAddress = [self convertStringtoCharArray:localIPAddress.text];
    localUser.latitude = currentLocation.coordinate.latitude;
    localUser.longitude = currentLocation.coordinate.longitude;

    //pass structure to be sent over socket
    int result = [myNetworkConnection registerWithServer:&localUser];

    NSString *message = nil;

    //process result of sending attempt
    if (result == 0) {
        //registration succesful
        message = [NSString stringWithString:@"Registration successful"];
    } else if (result == 1) {
        //server unavailable
        message = [NSString stringWithString:@"Server unavailable. Please check your wi-fi settings and try again."];
    } else if (result == 2) {
        //unable to establish connection
        message = [NSString stringWithString:@"Unable to communicate with server. Please check your wi-fi settings and try again."];
    } else if (result == 3) {
        //username already in use
        message = [NSString stringWithString:@"Username in use. Try another username."];
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Registration"
                                                    message:message
                                                   delegate:nil 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];

    [alert show];
    [alert release];
}

コードを実行すると、アラートを表示しようとしているように iPhone がグレー表示されますが、クラッシュします。EXC_BAD_ACCESSコンソールにエラーが表示されます。アラートまたはメッセージを正しくリリースしていませんか? コンソール出力は次のとおりです。

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) backtrace
#0  0x30011944 in objc_msgSend ()
#1  0x3054803e in NSPopAutoreleasePool ()
#2  0x3054c808 in -[NSAutoreleasePool release] ()
#3  0x30936ac4 in _UIApplicationHandleEvent ()
#4  0x3204696c in PurpleEventCallback ()
#5  0x30254a76 in CFRunLoopRunSpecific ()
#6  0x3025416a in CFRunLoopRunInMode ()
#7  0x320452a4 in GSEventRunModal ()
#8  0x308f037c in -[UIApplication _run] ()
#9  0x308eea94 in UIApplicationMain ()
#10 0x000020bc in main (argc=1, argv=0x2ffff508) at /Users/reu2009/Documents/iPhone Development/Development/BuddyTracker/main.m:14
(gdb) frame 10
#10 0x000020bc in main (argc=1, argv=0x2ffff508) at /Users/reu2009/Documents/iPhone Development/Development/BuddyTracker/main.m:14 14       int retVal = UIApplicationMain(argc, argv, nil, nil);

編集:回答に基づいて文字列を削除[message release];および割り当てました。[NSString stringWithString];

4

6 に答える 6

8

私はこのような問題を抱えていました...私はバックグラウンドスレッドからuiAlertViewを呼び出していました....メインスレッドから呼び出しました

于 2012-11-13T17:57:40.807 に答える
4

便利なコンストラクターから返されたオブジェクトは、既に autorelease に設定されています。「メッセージ」へのポインターを宣言しましたが、「メッセージ」オブジェクト自体はあなたのものではありません。これは、@"string" 便利なコンストラクターを使用して NSString オブジェクトを作成したためです。したがって、リリースする必要はありません。

手動で解放すると、何度も解放され (手動で 1 回、自動解放プロセスがロールアラウンドしたときに 1 回)、エラーがスローされます。

Apple からの追加情報を次に示します。

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

経験則: alloc または init または copy メソッドのいずれかを使用してオブジェクトを作成しない限り (またはオブジェクトを自分で保持する場合)、オブジェクトを解放する必要はありませんが、実際にオブジェクトを作成したメソッドに頼ることができます。あなたのためにその仕事をしてください。

于 2009-07-06T18:48:19.480 に答える
1

NSZombieEnabled = YES で試してください。

  • あなたの実行可能ファイルの情報に入ります。
  • [引数] タブをクリックします。
  • 「環境に設定する変数」の+をクリックします。
  • NSZombieEnable と YES を入力します。

解放済みのメモリが解放されると、NSZombie がアドレスを表示し、Instruments を使用して実際のオブジェクトを見つけることができます。Corbin の Treehouse は、これを行う方法の概要を説明しています: Instruments on Leopard: How to debug those random crashes in your Cocoa app

于 2009-07-06T21:09:49.443 に答える
0

Sean の言うとおりです。ここで [message release] を呼び出す必要はありません。メッセージ オブジェクトを実際に保持することはないからです。

ただ言う代わりにmessage = @"string"、あなたは言う必要がありますmessage = [NSString stringWithString:@"string"];正直に言うと、理由はわかりません(誰かがコメントして、この投稿を改善できるかもしれません!)が、それはうまくいくはずです.

于 2009-07-06T19:03:04.317 に答える
0

ここでも UIAlertView で同じ問題が発生しました。私の場合、アラートを実装する別のクラスがあり、別のクラスから静的メソッドを呼び出していました。次のように:

ClassA

...

doSomething {
 ... some stuff ...

 [MyAlertView showAlert];

 ... some other stuff...

}

私が疑うのは、ボタンをクリックするとアラートビューが非同期に表示されるため、オブジェクトはすでに解放されているということです。

それを確認するために、アラートをインスタンス化してリリースしないようにコードを変更しました。そして、すべてがうまくいきました。

私の最終的な解決策は、親ビューで変数を宣言し、ビューの割り当てが解除されたときに他の変数と一緒に割り当てを解除することでした。

于 2010-03-29T20:02:53.243 に答える