2013-09-25 13 views
29

UIAlertViewで「OK」をタップすると、私のアプリケーションがクラッシュする間、次のスタックトレースが得られました。それは私のせいかiOS7のバグでしょうか?私はこれを解決する方法を知らない。iOS 7 UIAlertViewのバグまたはバグ

OS Version:   iOS 7.0 (11A465) 
Report Version:  104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000 
Triggered by Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x39d50b36 objc_msgSend + 22 
1 UIKit       0x3212e3da -[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:] + 58 
2 UIKit       0x31ed2036 -[_UIModalItemsCoordinator _notifyDelegateModalItem:tappedButtonAtIndex:] + 90 
3 UIKit       0x31ed1f3e -[_UIModalItemAlertContentView tableView:didSelectRowAtIndexPath:] + 890 
4 UIKit       0x31dd7326 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1074 
5 UIKit       0x31e8a24e -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 210 
6 UIKit       0x31d3a96e _applyBlockToCFArrayCopiedToStack + 314 
7 UIKit       0x31cb246e _afterCACommitHandler + 426 
8 CoreFoundation     0x2f5141d2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18 
9 CoreFoundation     0x2f511b74 __CFRunLoopDoObservers + 280 
10 CoreFoundation     0x2f511eb6 __CFRunLoopRun + 726 
11 CoreFoundation     0x2f47cce2 CFRunLoopRunSpecific + 518 
12 CoreFoundation     0x2f47cac6 CFRunLoopRunInMode + 102 
13 GraphicsServices    0x3417727e GSEventRunModal + 134 
14 UIKit       0x31d1ea3c UIApplicationMain + 1132 
15 MyApp       0x000d8e5e 0xcb000 + 56926 
16 libdyld.dylib     0x3a25dab4 start + 0 

アラートビューのコード

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" 
    message:[NSString stringWithFormat:@"Es ist ein Fehler aufgetreten: %@", [error localizedDescription]] 
    delegate:self 
    cancelButtonTitle:@"OK" 
    otherButtonTitles:nil]; 
[av show]; 

と私は、デリゲートメソッドを定義していません。

+1

アラートビューの表示に使用するコードと、作成したデリゲートメソッドを表示できますか。ありがとう。 – Fogmeister

+0

@Fogmeisterによると、アラートコードとその代理コードを提供できますか?ありがとう! – matteodv

答えて

17

私愚かな、私はちょうどUIAlertViewのデリゲートがUIAlertViewで割り当て財産であるのでゼロ

+1

まさに、私はそれについてのコメントを書いていました! :) – matteodv

+0

@matteodvありがとう! –

+0

あなたは大歓迎です! – matteodv

13

にアラートビューのデリゲートを設定する必要があります。私はそれがAppleのせいだと思う。それはARCの弱いポインタでなければなりません。しかしそれは代入プロパティですので、代理人を破棄する前に、任意の警告ビューの代理人をnilに設定する必要があります(コントローラクラスがポップまたはナビゲートされたほとんどの時間)。デリゲートについてUIAlertViewの.hファイルを読んでください。これは代入プロパティであり、誰かが宣言の後に "// weak reference"とコメントしたことがわかります。

+0

それはまさに何が起こったのですか?アラートビューが表示されました。 –

+3

私は同じ問題を抱えていましたが、私たちはipaを作成して実行していました。シミュレータやデバッグではないなぜですか?何か案が? – Johnykutty

5

委任を使用しているときにUIAlertViewの問題を回避する最善の方法は、 デリゲートクラスのiVarとしてUIAlertViewのインスタンスを作成することです。あなたは、デリゲートクラス

@implementation YOUR_CLASS 
{ 
    UIAlertView *_alert; 
} 

- (void)dealloc 
{ 
    _alert.delegate = nil; 
} 


- (void)showAlertView 
{ 
    _alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
} 

のにdeallocではnilとしてalertViewのデリゲートプロパティを作成する必要があります後と同じアプローチがアサイン型のデリゲートを持つすべての古いクラスには十分です。

0

代理人を指定する必要がある場合は、アラートビューで「自動解除」を実行することもできます。

関連する問題