我发现了类似的问题,但没有一个解决了我的问题。
有一些viewcontrollers和工作应用程序。
我向其中一个viewcontrollers添加了一个按钮,并绑定了一个“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)
答案 0 :(得分:5)
您的问题的一个可能答案是您尝试将消息发送到对象的已释放实例。
尝试搜索zoombies(按⌘ ⌥ R ,选择诊断标签并激活启用Zombie Objects )。每个发布的对象都将成为NSZombie的一个实例,如果您尝试访问它们而不是崩溃,它们会将消息记录到控制台。
此外,在ARM体系结构(涉及iOS)上,r0
应指向消息的接收者。你可以尝试调查一下。它可能会产生有用的信息。 (在调试器上使用p/x $r0
命令。如果执行x/s $r1
,则应获取选择器名称。)
注意:强>
如果您要调试objc_msgSend()
内发生的崩溃,我强烈建议您查看Hamster Emporium存档上的[objc explain]: So you crashed in objc_msgSend()。它包含有价值的提示&从调试器中获取大部分信息的技巧以及调查崩溃发生的原因。
编辑:根据评论,但没有代码,人们只能猜测代码中某处一个对象(可能是detailviewcontroller
)注册的事件但是很快就被解除了分配。因此发送动作时崩溃。这只是一个提示,但恕我直言,值得在调试器中进行调查。
答案 1 :(得分:1)
我明白了!!!!
我通过逐步删除每个操作和属性的整个应用程序来解决它,并找到了罪魁祸首: (也许可以帮助有同样问题的人)
detailsviewcontroller是一个典型的uiviewcontroller,它是通过以下代码打开的:
detailviewcontroller *vc = [[detailviewcontroller alloc] initWithNibName:@"detailviewcontroller" bundle:nil];
[self.view addSubview:vc.view];
我替换为以下代码(刚删除了detailviewcontroller单词和*),问题解决了:
vc = [[detailviewcontroller alloc] initWithNibName:@"detailviewcontroller" bundle:nil];
[self.view addSubview:vc.view];
这也表明我应该为声明研究目标c;)
答案 2 :(得分: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视图:视图上只有一个按钮,我只需单击它