IBACTIONとEXC_BAD_ACCESS
-
20-09-2019 - |
質問
私はこの問題について多くを読んだが、鉱山はまだ何とか異なるようです。 だから私は理解したものから、EXC_BAD_ACCESSは、メモリ管理の問題で発生します。
事がある、鉱山はそこに(!:))は思えません。事は、私は単純なIB、丸みを帯びた矩形、無画像内のボタンを追加、です。私は私のクラスで定義されたIBACTIONとそれをフックアップ。このメソッドは、道で何も(!)しません。
とにかく、できるだけ早く私はボタンをクリックすると、アプリケーションは、「EXC_BAD_ACCESS」と、クラッシュします。
私は確かに何かをoverreleasingないです、私の知る限り、それはです。何が間違っているのですか?
任意の手がかり?
これは私のコンソールログは次のとおりです。
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
解決
私も同様に数時間のためにこれによって拷問を受けました。これは、予想通り、メモリの問題であることが判明しました。ボタンのターゲットとして動作するコントローラが割り当て解除されました。これは、ビューウィンドウに直接添加したナビゲーションコントローラのルートコントローラました。私のコードは次のように見えます:
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];
}
他のヒント
これはメモリの問題があります。これは、コントローラの参照がスコープ外に落下するので、そのメモリが割り当て解除されると実行することです。
あなたはこのようにコントローラを開始した場合:
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に値を設定します。
私は考えを持っています。それはとっくの昔に私に起こりました。 IBでは、あなたのViewプロパティは、あなたのビューにフックアップされる?
私は一度これらを外され、アプリが起動しません。
ところで、悪いことは悪いことになる、再度プロジェクトを開始します。 youveはこれまでの仕事の2分を行っている場合、これらの頭痛の価値はありません。
iPhoneプログラミングの世界へようこそ。 あなたはかなりすぐにwigsmen.comこれらのいずれかが必要な場合があります; - )