2010-02-03 85 views
1

基本上问题正是标题所说的。iPhone:调用[NSBundle mainbundle]在设备上崩溃但不是模拟器

我的应用程序在模拟器上运行平稳,没有任何崩溃。实际上,以前的版本在应用商店中。我在这里和那里做了一些小的改变,突然它开始在一个非常奇怪的地方坠毁。

我用在不同的地方[NSBundle mainBundle] resourcepath]在代码中访问的plist文件,图像等来NSBundle mainBundle]最初的几个电话是完全正常的,因为expected-,但是,在某些时候,它返回......

-[NSBundle < null selector>]: unrecognized selector sent to instance 0x10a0e0 

...并在设备上崩溃。这是确切的代码片段:

-(void) setImageName:(NSString *)s 
{ 
[imageName release]; 
imageName = [s copy]; 
NSLog(@"last line before crash"); 
NSString *imagePath =[[NSBundle mainBundle] resourcePath]; 
NSLog(@"Why would it crash before here???"); 

    imagePath = [imagePath stringByAppendingString:imageName]; 
    imageUI = [[UIImage alloc] initWithContentsOfFile:imagePath]; 
    [self setNeedsDisplay]; 
} 

要检查,如果这一呼吁是真正的问题,我救resourcePath到第一串曾经打电话[NSBundle mainbundle]项目(第几个电话是完全正常的,因为我如上所述)并使用resourcePath字符串到处我需要[NSbundle mainbundle]和瞧!没有崩溃/泄漏,什么都没有...

我完全困惑..为什么会打电话崩溃我的应用程序在设备上,但不是模拟器?

编辑:使用...

NSArray *array = [NSBundle allBundles]; 
NSBundle *bundle = [array objectAtIndex:0]; 
NSString *imagePath = [bundle bundlePath]; 

...而不是[[NSBundle mainBundle] resourcePath]工作过。我想不知怎么,我只是在做一些影响这个特定通话的事情。

编辑2:这是当我在设置断点回溯 - [NSObject的doesNotRecognizeSelector:]:

#0 0x30e27b98 in -[NSObject doesNotRecognizeSelector:] 
#1 0x30dacb18 in ___forwarding___ 
#2 0x30da3840 in __forwarding_prep_0___ 
#3 0x0000bcfe in -[CustomTableViewCell setImageName:] at CustomTableViewCell.m:93 
#4 0x0000499e in -[RootTableViewController tableView:willDisplayCell:forRowAtIndexPath:] at RootTableViewController.m:469 
#5 0x3364d5d0 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] 
#6 0x3364cde0 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] 
#7 0x335f832c in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow] 
#8 0x335f6514 in -[UITableView layoutSubviews] 
#9 0x335f22d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] 
#10 0x32bac1c0 in -[CALayer layoutSublayers] 
#11 0x32babedc in CALayerLayoutIfNeeded 
#12 0x32bab844 in CA::Context::commit_transaction 
#13 0x32bab474 in CA::Transaction::commit 
#14 0x32bb35dc in CA::Transaction::observer_callback 
#15 0x30da1830 in __CFRunLoopDoObservers 
#16 0x30de9346 in CFRunLoopRunSpecific 
#17 0x30de8c1e in CFRunLoopRunInMode 
#18 0x332e7374 in GSEventRunModal 
#19 0x335adc30 in -[UIApplication _run] 
#20 0x335ac230 in UIApplicationMain 

...,其中#3 - CustomTableViewCell.m:93的NSString *的ImagePath = [[NSBundle mainBundle] resourcePath];在我上面发布的部分代码中。

+0

你释放返回的对象从'[一个NSBundle mainBundle]'地方? – kubi 2010-02-03 19:02:36

+1

在' - [NSObject doesNotRecognizeSelector:]'上设置断点并发布回溯。 – Chuck 2010-02-03 19:13:38

+0

@chuck - Thx,但我不明白我应该把断点放在哪里 – 2010-02-03 21:27:42

回答

1

在设备A上的碰撞而不是仿真器(反之亦然)通常是由编译库/框架被遵守为一个硬件平台而不是其他引起的。由于模拟器在英特尔和手臂上运行,所以会导致奇怪的崩溃。检查您可能添加的任何内容,尤其是您最近未编译的任何内容。

错误-[NSBundle < null selector>]: unrecognized selector sent to instance 0x10a0e0暗示无论什么原因NSBundle类已“忘记”它有一个mainBundle方法。请注意,它是空的选择器,而不是我们在与内存相关的错误中期望的对象。这表明某处存在高水平的腐败。

我把下面的日志任何调用之前[NSBundle mainBundle];

NSLog(@"responds to selector mainBundle=%@",[NSBundle respondsToSelector:@selector(mainBundle)][email protected]"YES":@"NO"); 

这会告诉你,如果它真的是突然失去了mainBundle选择。

Edit01:

谢谢您的回答。这似乎 一个NSBundle指出它可以以 mainbundle回应:“响应选择器 mainBundle = YES”,只是 崩溃呼叫[一个NSBundle mainBundle]

嗯之前,崩溃必须足够坏引起错误的错误代码返回。这表明问题可能在调用mainBundle之前或之后的行中。

鉴于在CustomTableViewCell发生崩溃,我会猜测这是在笔尖的一个问题。你有一个在笔尖中定义的UITableViewCell的子类吗?你有在nib中定义的图像吗?它是什么文件类型?不同的图像或不同的笔尖会发生同样的错误吗?

我认为关键的线索是,它在模拟器上而不是设备上。您需要查找基于硬件的行为不同的事物。

你肯定能够得到一个很难在这里。

+0

感谢您的回答。看起来Nsbundle声明它可以响应mainbundle:“响应选择器mainBundle = YES”,就在崩溃前调用[NSBundle mainBundle]。 – 2010-02-04 07:57:08

+0

查看我的Edit01了解更多创意。 – TechZen 2010-02-04 12:57:17

+0

这个问题其实很难。这不是该项目的特定部分,即CustomTableViewCell,它会导致崩溃。我从项目中删除了CustomTableViewCell,而不是使用标准单元格,然后再次调用项目中的[NSBundle mainbundle] - 无论它在哪里 - 都会导致崩溃,正如我在原始文章中所述,[NSBundle allBundles]方法的工作原理。其实我并没有陷入这个错误,我刚刚在第一次发布后立即移动,但我很想知道什么会导致错误,这就是为什么我保持崩溃的版本,并应用这里建议的东西。 – 2010-02-04 13:31:49

1

问题基本上就是标题所说的。 - 不,它不是。我可以保证你的[NSBundle mainBundle]不是这次坠机的原因。崩溃是您的代码的另一部分中出现错误的症状。比如糟糕的内存管理。

+0

以及我同意你在那里肯定有一个错误,但为什么当我使用预定义的字符串而不是[[nsbundle mainbundle] resourcepath]在那个特定的代码片段中看到没有崩溃?并没有错误 - [NSBundle ]本身真的很奇怪? – 2010-02-03 20:05:03

+0

是的,它指向我认为的内存腐败。 – 2010-02-03 20:56:53

4

打开NSZombieEnabled,你会看到问题出在哪里。

+0

我进入iphone objective-c世界时最喜欢的旗帜。这是一种苹果实现这种语言的(不寻常)范式的必要性。 – KevinDTimm 2010-02-03 18:46:56

+2

我会很感兴趣,看看这是否真的有效。 Ahmet报告的错误通常不会导致错误的内存管理,但很难看出还有什么可能存在错误。 – Chuck 2010-02-03 19:09:21

+0

thx为答案,但我已经尝试nszombie并没有得到任何除了 - [NSBundle ]: – 2010-02-03 20:10:05

0

一个可能的问题是,如果出于某种原因,您碰巧传递了相同的imageName两次,您将在保留它之前释放它。您可能需要将前两行更改为:

if (imageName != s) { 
    [imageName release]; 
    imageName = [s retain]; 
} 
+0

thx,但即时密切跟随imagename的内存分配。 – 2010-02-03 20:05:48

1

请注意,将硬编码路径字符串插入到文档中并不是一个好主意。你的路径发生变化(通常每个版本)。就你的崩溃而言,很难知道没有看到更多的代码。但是看看这个建议:中

代替

[imagePath stringByAppendingString:imageName]; 

你应该使用

[imagePath stringByAppendingPathComponent:imageName]; 

stringByAppendingPathComponent是专为处理路径和文件名适合。

+0

thx,我已经试过了,实际上我已经注释掉了那部分并且没有使用[[nsbundle mainbundle] resourcepath]并且仍然看到了崩溃 – 2010-02-03 20:07:40

1

你应该能够做到[NSBundle mainBundle]几乎随时随地。如何将它分散到代码中,以便第一次破解时,希望能够接近于破坏内存管理的事情(即发生内存破坏),因为St3fan声明可能是问题所在。

相关问题