質問

私はこの問題について多くを読んだが、鉱山はまだ何とか異なるようです。 だから私は理解したものから、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];
}

他のヒント

ガンマ1と他の人が指摘したように、

これはメモリの問題があります。これは、コントローラの参照がスコープ外に落下するので、そのメモリが割り当て解除されると実行することです。

あなたはこのようにコントローラを開始した場合:

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これらのいずれかが必要な場合があります; - )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top