iPhone:调用[NSBundle mainbundle]会在设备上崩溃,但不会在模拟器上崩溃

iPhone:调用[NSBundle mainbundle]会在设备上崩溃,但不会在模拟器上崩溃,iphone,xcode,crash,nsbundle,Iphone,Xcode,Crash,Nsbundle,基本上,问题正是标题所说的 我的应用程序在模拟器上运行平稳,没有任何崩溃。 事实上,以前的版本在应用商店中。我在这里和那里做了一些小的改变,突然它开始在一个非常奇怪的地方崩溃 我在代码中的不同位置使用[NSBundle mainBundle]resourcepath]来访问plist文件、图像等。对NSBundle mainBundle]的最初几次调用与预期一样完全正常,但在某些时候它会返回 -[NSBundle < null selector>]: unrecognized sel

基本上,问题正是标题所说的

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

我在代码中的不同位置使用[NSBundle mainBundle]resourcepath]来访问plist文件、图像等。对NSBundle mainBundle]的最初几次调用与预期一样完全正常,但在某些时候它会返回

-[NSBundle < null selector>]: unrecognized selector sent to instance 0x10a0e0
为了检查这个调用是否真的有问题,我在项目中第一次调用[NSBundle mainbundle]时,将resourcePath保存到一个字符串中。正如我前面所述,最初的几个调用是完全正常的,并且在我需要[NSBundle mainbundle]的任何地方都使用了这个resourcePath字符串,瞧!没有碰撞/泄漏,什么都没有

我完全糊涂了。。为什么那个电话会使我的应用程序在设备上崩溃,而不是在模拟器上崩溃

编辑:使用

NSArray *array = [NSBundle allBundles];
NSBundle *bundle = [array objectAtIndex:0];
NSString *imagePath = [bundle bundlePath];
…而不是[[NSBundle mainBundle]resourcePath]也起作用。我想我只是在做一些影响这个电话的事情

编辑2:这是我在-[NSObject DoesNotReconficateSelector:]中设置断点时的回溯:

#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];在我上面发布的代码部分中。

基本上问题正是标题所说的不,不是。我可以向您保证[NSBundle mainBundle]不是崩溃的原因。崩溃是代码另一部分出错的症状。例如,坏内存管理。

基本上,问题正是标题所说的。-不,不是。我可以向您保证[NSBundle mainBundle]不是崩溃的原因。崩溃是代码另一部分出错的症状。比如坏内存管理。

打开NSZombieEnabled,您将看到问题的真正所在。

打开NSZombieEnabled,您将看到问题的真正所在。

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

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

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

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

请注意,将路径字符串硬编码到文档中不是一个好主意。您的路径通常会随着每次构建而改变。就您的崩溃而言,如果看不到更多代码,就很难知道。但看看这个建议:

而不是

 [imagePath stringByAppendingString:imageName]; 
你应该使用

 [imagePath stringByAppendingPathComponent:imageName];

stringByAppendingPathComponent特别适合处理路径和文件名。

请注意,将路径字符串硬编码到文档中不是一个好主意。您的路径通常会随着每次构建而改变。就您的崩溃而言,如果看不到更多代码,就很难知道。但看看这个建议:

而不是

 [imagePath stringByAppendingString:imageName]; 
你应该使用

 [imagePath stringByAppendingPathComponent:imageName];

stringByAppendingPathComponent特别适合于处理路径和文件名。

设备上的崩溃而不是模拟器,反之亦然,通常是由编译的库/框架引起的,该库/框架针对一个硬件平台而不是另一个硬件平台。由于模拟器在intel上运行,而设备在arm上运行,因此会导致奇怪的崩溃。检查您可能添加的任何内容,尤其是最近没有编译的内容

错误-[NSBundle]:发送到实例0x10a0e0的无法识别的选择器表明,无论出于何种原因,NSBundle类忘记了它有一个mainBundle方法。请注意,选择器为null,而不是内存相关错误中预期的对象。这表明某个地方存在着高层腐败

我会在调用[NSBundle mainBundle]之前放置以下日志

这将告诉您它是否真的突然丢失mainBundle选择器

Edit01:


谢谢你的回答。看来 Nsbundle声明它可以响应 mainbundle:响应选择器 mainBundle=是,就在 对[NSBundle mainBundle]的呼叫崩溃

嗯,崩溃必须严重到足以导致错误代码返回。这表明问题可能出现在调用mainBundle之前或之后

鉴于崩溃发生在CustomTableViewCell中,我猜这是nib中的一个问题。您是否在nib中定义了UITableViewCell的子类?您是否在nib中定义了图像?它是什么文件类型?不同的图像或不同的笔尖是否会出现相同的错误

我认为关键的线索是它在模拟器上工作,但在设备上不工作。您需要根据硬件寻找行为不同的东西

Y
你肯定有个难题

设备(而非模拟器)崩溃,反之亦然,通常是由编译的库/框架(为一个硬件平台而非另一个硬件平台编译)引起的。由于模拟器在intel上运行,而设备在arm上运行,因此会导致奇怪的崩溃。检查您可能添加的任何内容,尤其是最近没有编译的内容

错误-[NSBundle]:发送到实例0x10a0e0的无法识别的选择器表明,无论出于何种原因,NSBundle类忘记了它有一个mainBundle方法。请注意,选择器为null,而不是内存相关错误中预期的对象。这表明某个地方存在着高层腐败

我会在调用[NSBundle mainBundle]之前放置以下日志

这将告诉您它是否真的突然丢失mainBundle选择器

Edit01:


谢谢你的回答。看来 Nsbundle声明它可以响应 mainbundle:响应选择器 mainBundle=是,就在 对[NSBundle mainBundle]的呼叫崩溃

嗯,崩溃必须严重到足以导致错误代码返回。这表明问题可能出现在调用mainBundle之前或之后

鉴于崩溃发生在CustomTableViewCell中,我猜这是nib中的一个问题。您是否在nib中定义了UITableViewCell的子类?您是否在nib中定义了图像?它是什么文件类型?不同的图像或不同的笔尖是否会出现相同的错误

我认为关键的线索是它在模拟器上工作,但在设备上不工作。您需要根据硬件寻找行为不同的东西



你在这里肯定遇到了麻烦

您应该可以随时执行[NSBundle mainBundle]。把它分散在你的代码中,以便在它第一次崩溃时捕捉到它,希望接近于破坏内存管理的东西,也就是说,St3fan状态下发生的内存损坏可能是问题所在。

你应该可以随时执行[NSBundle mainBundle]。把它分散在你的代码中,以便在它第一次崩溃时捕捉到它,希望接近于破坏内存管理的东西,即St3fan状态下发生的内存损坏可能是问题。

进入iphone objective-c世界时,我最喜欢的标志。这是实现这种语言的不寻常范例的必要条件。我想看看这是否真的有效。Ahmet报告的错误通常与糟糕的内存管理无关,但很难看出还有什么其他原因是错误的。答案是thx,但我已经尝试了nszombie,除了-[NSBundle]之外,没有得到任何提示:进入iphone objective-c世界时,我最喜欢的标志。这是实现这种语言的不寻常范例的必要条件。我想看看这是否真的有效。Ahmet报告的错误通常与内存管理不好无关,但很难看出还有什么其他原因可能是错误的。thx的答案是,但我已经尝试了nszombie,除了-[NSBundle]之外,没有得到任何提示:您是否正在释放从[NSBundle mainBundle]返回的对象?在上设置断点-[NSObject不识别选择器:]并发布回溯。@chuck-Thx,但我不知道应该将回溯放在哪里breakpoint@kubi-我无法从[NSBundle mainBundle]获取对象,所以,不,我不释放it@ahmet如果打开“断点”窗口,则可以双击列表底部的项目以设置符号断点。是否释放从[NSBundle mainBundle]任何位置返回的对象?在-[NSObject DOESNOTRENCENSELECTOR:]上设置断点然后把回溯贴出来。@chuck-Thx但我不知道应该把回溯贴放在哪里breakpoint@kubi-我无法从[NSBundle mainBundle]获取对象,所以,不,我不释放it@ahmet如果打开“断点”窗口,您可以双击列表底部的项目来设置符号断点。我同意您的看法,一定是某个地方出现了错误,但为什么不使用预定义字符串而不是[[nsbundle mainbundle]resourcepath]时,我看不到任何崩溃在那个特定的代码段中?错误-[NSBundle]本身不是很奇怪吗?我同意你的观点,一定在某个地方有错误,但是为什么我在那个特定的代码段中使用预定义的字符串而不是[[NSBundle mainbundle]resourcepath]时没有看到崩溃?错误-[NSBundle]它本身真的很奇怪吗?thx,但我密切关注imagename.thx的内存分配,但我密切关注imagename.thx的内存分配,我已经试过了,事实上我注释掉了那个部分,并没有使用[[nsbundle mainbundle]resourcepath],仍然看到了崩溃,我已经试过了,事实上我通信了
我把那个部分删掉了,并没有使用[[nsbundle mainbundle]resourcepath],但仍然看到了答案。似乎Nsbundle声明它可以响应mainbundle:responses to selector mainbundle=YES,就在对[Nsbundle mainbundle]的崩溃调用之前。有关更多想法,请参阅我的Edit01。问题实际上更难解决。导致崩溃的不是项目的特定部分,即CustomTableViewCell。我从项目中删除了CustomTableViewCell,改为使用标准单元格,然后再次调用项目中的[NSBundle mainbundle],无论它在哪里,都会导致崩溃,正如我在原始帖子中所述,[NSBundle allBundles]方法起作用。事实上,我并没有被这个错误所困扰,我在第一次发布到这里之后就继续前进了,尽管如此,我还是很想知道是什么导致了这个错误,这就是为什么我要保留这个崩溃的版本并应用这里建议的东西。我被难住了,没有想法。不是我在抱怨,而是为什么这是正确的答案?看来我完全错了。我们不想让将来的人在看这篇文章时感到困惑。您可能需要更新解决方案以使其更清晰。谢谢您的回答。似乎Nsbundle声明它可以响应mainbundle:responses to selector mainbundle=YES,就在对[Nsbundle mainbundle]的崩溃调用之前。有关更多想法,请参阅我的Edit01。问题实际上更难解决。导致崩溃的不是项目的特定部分,即CustomTableViewCell。我从项目中删除了CustomTableViewCell,改为使用标准单元格,然后再次调用项目中的[NSBundle mainbundle],无论它在哪里,都会导致崩溃,正如我在原始帖子中所述,[NSBundle allBundles]方法起作用。事实上,我并没有被这个错误所困扰,我在第一次发布到这里之后就继续前进了,尽管如此,我还是很想知道是什么导致了这个错误,这就是为什么我要保留这个崩溃的版本并应用这里建议的东西。我被难住了,没有想法。不是我在抱怨,而是为什么这是正确的答案?看来我完全错了。我们不想让将来的人在看这篇文章时感到困惑。您可能需要使用解决方案进行更新,以使其更清晰。