2

同様の問題を見つけましたが、どれも私の問題を解決しませんでした。

いくつかのビューコントローラーと作業中のアプリケーションがあります。

ビューコントローラーの 1 つにボタンを 1 つ追加し、"sampleclick" アクションをバインドしました。このアクションには何もありません (コード、行、空のメソッドのみ)。アプリケーションは次のブロックでクラッシュします。

すべての出力ログ:

(lldb)

およびスタック:

libobjc.A.dylib`objc_msgSend:
0x10ed08c:  movl   8(%esp), %ecx
0x10ed090:  movl   4(%esp), %eax
0x10ed094:  testl  %eax, %eax
0x10ed096:  je     0x10ed0e8                 ; objc_msgSend + 92
0x10ed098:  movl   (%eax), %edx
0x10ed09a:  pushl  %edi
0x10ed09b:  movl   8(%edx), %edi
0x10ed09e:  pushl  %esi
***0x10ed09f:  movl   (%edi), %esi   >>> crashes here with :Thread1:EXC_BAD_ACCESS*** (code=1,address: .....)
0x10ed0a1:  movl   %ecx, %edx
0x10ed0a3:  shrl   $2, %edx
0x10ed0a6:  andl   %esi, %edx
0x10ed0a8:  movl   8(%edi,%edx,4), %eax
0x10ed0ac:  testl  %eax, %eax
0x10ed0ae:  je     0x10ed0b9                 ; objc_msgSend + 45
0x10ed0b0:  cmpl   (%eax), %ecx
0x10ed0b2:  je     0x10ed0d0                 ; objc_msgSend + 68
0x10ed0b4:  addl   $1, %edx
0x10ed0b7:  jmp    0x10ed0a6                 ; objc_msgSend + 26
0x10ed0b9:  popl   %esi
0x10ed0ba:  popl   %edi
0x10ed0bb:  movl   4(%esp), %edx
0x10ed0bf:  movl   (%edx), %eax
0x10ed0c1:  jmp    0x10ed0d9                 ; objc_msgSend + 77
0x10ed0c3:  nopw   %cs:(%eax,%eax)
4

3 に答える 3

5

問題に対する考えられる答えの 1 つは、オブジェクトの割り当てが解除されたインスタンスにメッセージを送信しようとしているということです。

ズームビーを探してみてください(押してください⌘</kbd>⌥</kbd>R, select the Diagnostics tab and activate Enable Zombie Objects). Every released object will become an instance of NSZombie, which will log messages to the console if you ever try to access them instead of crashing.

また、ARM アーキテクチャ (iOS に関係する) ではr0、メッセージの受信者を指す必要があります。これを調査してみることができます。有益な情報が得られるかもしれません。(p/x $r0デバッガ上で command を使用。 を実行するx/s $r1と、セレクタ名が取得されるはずです。)

注:
それまでに発生したクラッシュをデバッグする場合は、 [objc Explain]: So you crashed in objc_msgSend() on the Hamster Emporium archive をobjc_msgSend()参照することを強くお勧めします。デバッガーからほとんどの情報を取得し、クラッシュが発生した理由を調査するための貴重なヒントとコツが含まれています。

編集:コメントから、ただしコードがなければ、コードのどこかでオブジェクト (可能性が高いdetailviewcontroller) がイベントに登録されているが、割り当てが解除されるのが早すぎると推測できます。したがって、アクションを送信するとクラッシュします。これは単なるヒントですが、デバッガーで調査する価値があります。

于 2013-04-20T20:06:04.030 に答える
0

ここに.mファイルがあります:

#import "detailviewcontroller.h"

@interface detailviewcontroller ()

@end

@implementation detailviewcontroller

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

-(IBAction)denemecik:(id)sender
{
// there is no code here 
}

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
//NSLog(@"memori warning aldım");
// Dispose of any resources that can be recreated.
}

.h ファイルは次のとおりです。

#import <UIKit/UIKit.h>
@interface detailviewcontroller : UIViewController
{
}
-(IBAction)denemecik:(id)sender;
@end

およびxibビュー:ビューにはボタンが1つだけあり、クリックするだけです

于 2013-04-21T14:22:48.840 に答える