24

私はこの問題について多くのことを読みましたが、私のものはまだどういうわけか違うようです. 私が理解したことから、EXC_BAD_ACCESSはメモリ管理の問題で発生します。

問題は、私のものは (! :)) そこにあるようには見えないということです。問題は、IBにボタンを追加しただけで、丸みを帯びた四角形で、画像がありませんでした。クラスで定義したIBACTIONに接続しました。ちなみに、このメソッドは何もしません (!)。

とにかく、ボタンをクリックするとすぐに、「EXC_BAD_ACCESS」でアプリがクラッシュします。

私が見る限り、私は確かに何も過剰にリリースしていません。何が問題なのですか?

手がかりはありますか?

これは私のコンソールログです:

Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-148-79
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 11779]
[Switching to thread 11779]
(gdb) continue
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

スタックを上った後、これが得られます。

#0  0x31ec3ebc in objc_msgSend ()
#1  0x33605784 in -[UIApplication sendAction:to:from:forEvent:] ()
#2  0x336056ec in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#3  0x336056b4 in -[UIControl sendAction:to:forEvent:] ()
#4  0x3360530c in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#5  0x33605f8c in -[UIControl touchesEnded:withEvent:] ()
#6  0x335fd9ac in _UIGestureRecognizerUpdateObserver ()
#7  0x30da1830 in __CFRunLoopDoObservers ()
#8  0x30de9346 in CFRunLoopRunSpecific ()
#9  0x30de8c1e in CFRunLoopRunInMode ()
#10 0x332e7374 in GSEventRunModal ()
#11 0x335adc30 in -[UIApplication _run] ()
#12 0x335ac230 in UIApplicationMain ()
#13 0x000027a8 in main (argc=1, argv=0x2ffff4d8) at /Users/SomePath/main.m:14
4

3 に答える 3

53

私もこれで数時間苦しめられました。予想通り、メモリの問題であることが判明しました。ボタンのターゲットとして機能しているコントローラーの割り当てが解除されました。これは、ビューがウィンドウに直接追加されたナビゲーション コントローラーのルート コントローラーでした。私のコードは次のようになりました:

MyController *myController = [[MyController new] autorelease];
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];

のルートコントローラーとしてmyController渡されたときに保持されると思っていましたUINavigationControllerが、それは間違っていることが判明しました。解決策は、コントローラーをローカル変数に割り当てて、 で解放することでしたdealloc。上記のコードを含むオブジェクトのインターフェースには、次のものが必要です。

...
@property (retain, nonatomic) MyController *myController;
...

そして実装:

self.myController = [[MyController new] autorelease];
UINavigationController* navController = 
    [[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];

...

- (void)dealloc {
    [self.myController release];
    ...
    [super dealloc];
}
于 2010-02-24T01:42:13.040 に答える
4

gammal や他の人が指摘したように、これはメモリの問題です。これは、コントローラーの参照がスコープから外れるため、そのメモリの割り当てが解除されることに関係しています。

次のようにコントローラーを開始する場合:

MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

参照は手動で解放されるまで割り当てが解除されないため、ARC を使用していない場合は問題ありません。そのため、プロジェクトをアップグレードしてARCを使用するときに、この問題が発生しました。

コントローラーを自動解放として開始するか、ARC を使用している場合、コントローラーが存在するスコープが終了するとすぐに、ガベージ コレクターがコントローラーの割り当てを解除し、ボタン プレス イベントによって不良メモリ例外が発生します。

これを解決する方法は、参照を有効にしておくことです。そのため、インターフェイスで宣言するか、プロパティとして外部アクセスが必要な場合に宣言します。

@interface MyParentController : UIView {
@private
    MyController* controller;
}

次に、次のように追加します。

controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

後でメモリを収集したい場合は、値を nil に設定してください。

于 2013-03-17T01:18:34.750 に答える
0

考えがあります。それは何年も前に私に起こりました。IB では、View プロパティがビューに接続されていますか?

私はかつてこれらのフックを外しましたが、アプリは起動しませんでした.

ところで、さらに悪いことに、プロジェクトをやり直してください。これまでに 2 分間の作業を行った場合、これらの頭痛に値するものではありません。

iPhoneプログラミングの世界へようこそ。これらのいずれかがすぐに必要になるかもしれません。wigsmen.com ;-)

于 2010-01-15T11:15:01.750 に答える