首页 > 代码库 > iOS开发---- 开发错误汇总及解决方法

iOS开发---- 开发错误汇总及解决方法

本文转载至 http://blog.csdn.net/shenjx1225/article/details/8561695

 

一、今天调试程序的时候,出现了一个崩溃,信息如下:

 

2013-02-01 09:05:23.929 SD4iPhone[627:c07] *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘Invalid update: invalid number of sections.  The number of sections contained in the table view after the update (5) must be equal to the number of sections contained in the table view before the update (5), plus or minus the number of sections inserted or deleted (0 inserted, 1 deleted).‘

*** First throw call stack:

(0x2424052 0x961d0a 0x23cca78 0x14822db 0x18d4257 0x18df518 0x18df593 0x9699b58 0x12111 0x2425e72 0x14119ef 0x23f897f 0x235bb73 0x235b454 0x235adb4 0x235accb 0x2801879 0x280193e 0x1850a9b 0x20c22 0x2a05)

terminate called throwing an exception(lldb) 

 

我要做的是一个table有几个section,每个section都存放一个个人地址,最后一个section是添加个人地址用的,如果地址数量达到5个,则最后一个添加新地址的section不显示。

之前section个数是这样给的:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. return [self.addsArray count]<5 ? [self.addsArray count] + 1 : [self.addsArray count];  


在删除的时候先删除数据源,然后做删除列表刷新界面操作,但是这样会报出如上的错误。

 

这个错误的意思是说:我删除之前有5个section,删除之后section数量不变(由于我需要重现添加新地址这个section就导致section数量不变)。这是矛盾的,所以xcode就给我报错了。

我的解决办法是:定义了一个局部变量sectionCount,未作删除操作时,它的数量就是

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. [self.addsArray count]<5 ? [self.addsArray count] + 1 : [self.addsArray count];  


再删除操作时是这样的:

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. BOOL success = [[DataCenter singleton] deleteAddressFromeDB:userAdds.user_id  
  2.                                               withAddressId:userAdds.address_id];  
  3. [self.addsArray removeObjectAtIndex:deleteSection];  
  4. sectionCount = [self.addsArray count];  
  5. [addressTable deleteSections:[NSIndexSet indexSetWithIndex:deleteSection]  
  6.             withRowAnimation:UITableViewRowAnimationFade];  
  7. sectionCount = sectionCount+1;  
  8. [addressTable reloadData];  


综上所述:1.先删除数据源,再做删除section操作,2.再增加一个section(添加新地址的),再刷新界面。这样就可以解决这个问题了。

 

 

二、EXC_BAD_ACCESS

这个问题对于初学者来说,估计够DT的。这个崩溃最大可能就是过度释放引起的,但是从打印的信息根本看不出来,这里说一个我常用的方法,如下图(xcode版本不同,位置可能不一样,我用的是4.5的版本):

-->(勾上Enable Zombie Objects)

然后再次运行,可以看到这样的打印信息:

可以看出应该是一个table过度释放了(运气好的话会在代码中直接指出你崩溃的那一行),然后去找那个table在哪过度释放了,这样问题就解决了。(当然了,这个方法并不是百试百灵,有时候你还得一步步的跟踪,调试大笑

 

三、Undefined symbols for architecture i386:

解决办法:http://blog.csdn.net/azhou_hui/article/details/18312047

 

四、Local declaration of ‘xxx‘ hides instance variable

 

这是由于定义了一个与成员变量相同名称的局部变量引起的,只要将局部变量或者成员变量的名称修改一个就行了。

 

五、-[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0xfe8afb0

消息发送给了一个已经释放的对象,就是说你使用的对象已经被释放掉了,检查一下这个对象的内存管理吧。

***

六 、Unbalanced calls to begin/end appearance transitions for <UIViewController: 0x1111fec0>.

 

找到了出现问题的地方:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 1. id pp = [vc performSelector:@selector(presentingController)];  
  2.  2. [pp presentModalViewController:nav animated:YES];  


      在第一行代码中presentingController方法中有动画还未执行完成,第二行就开始了,这就导致了出现上述问题。解决类似问题的办法就是让第一个动画执行完成之后再执行下一个动画。

 

七、Direct access to objective-c‘s isa is deprecated in favor of object_setClass() and object_getClass()

在xcode 4.6的jsonKit中碰到上面的警告,谷歌了下,有下面两个解决办法:

object->isa = xxx;替换为object_setClass(object,xxx) ;或者object_getClass(object) = xxx;

 

八,模拟器上图片显示,真机不显示

原因可能有一下两种:

1.图片非png格式

2.图片名称大写问题,模拟器不区分大小写,真机区分

(刚学习的,如果还有其他可能,欢迎补充)

九、第一次运行崩溃,第二次正常

解决办法:

把调试器LLDB换成GDB

步骤:

      新版XCode(4.3以后的)的调试器,默认是用lldb,据说ll这套是比较高级的新版本。
      可是XCode下用貌似有各种问题。比如断点去掉了依然不停的断在那里。
      如果不胜其烦,可以用gdb来替代。

      Product->Edit Scheme-> Run xxx.app(TargetName) -> Info -> Debugger 选择gdb即可

十、warning: no rule to process file ‘$(PROJECT_DIR)/Photo/SelectFileDetailVC.h‘ of type sourcecode.c.h for architecture armv7

找到“Build Phases”(不知道在哪的可以看上面第三个问题,有步骤),删除掉“SelectFileDetailVC.h”这个文件即可。

 

十一、Unbalanced calls to begin/end appearance transitions for <uivewcontroller>

这个问题是由于上一个动画还没结束,下一个动画就开始了,造成的。

这里有个一解决方法:http://www.kaifajie.cn/ios/9413.html

 

十二、ASIHTTPRequest 类库在iOS 7.0中(这个是转来的,不过我发现iOS6也会有警告),会有一些报错警告,需要稍作修改:


  1、
if ([inputStream streamStatus] == NSStreamEventErrorOccurred) {


  修改成:
if ([inputStream streamStatus] == (NSStreamStatus)NSStreamEventErrorOccurred) {




  2、
return [[NSDate date] addTimeInterval:maxAge];


  修改成:
return [[NSDate date] dateByAddingTimeInterval:maxAge];

 

 

十三、xcode4.5真机调试问题:

提示信息如下:
Xcode cannot run using the selected device.

Choose a destination with a supported architecture in order to run on this device.

1、怀疑证书有问题。不过检查了很久都没有发现。

2、开始怀疑ios的版本问题。真机的ios版本是ios5.1。xcode4.5是给最新版本的ios6的。不过感觉也不对,以前的xcode版本会提示xcode不支持你现有设备的版本。建议你下载这个版本的ios debug包。但是这次并没有这个提示。
我又用一台4.1版本的设备链接到xcode。这次就提示xcode只支持ios 4.3、5.0、5.1、6.0这几个版本。这次排除了设备的ios版本问题。
这时候只能求助万能的google了。发现解决方案了。http://stackoverflow.com/questions/11673424/xcode-4-4-unable-to-run-project。


原来是xcode4.5现在只支持ARM7指令的编译。现有项目设置是同时支持ARM6和ARM7编译。把项目编译选择成只支持ARM7就可以真机调试了。根据帖子讲,xcode4.5编译出来的程序只能运行在ios4.3以上的系统。如果想兼容旧有版本的话需要使用旧版本的xcode编译。(可能还有另外的解决方案,暂时没有去研究)

 

十四、(format 10, created by Subversion 1.6)问题

 

原文链接:http://blog.csdn.net/tongzhitao/article/details/18221831

项目,用Version工具check out。

Xcode5升级了相关东西,就出现了 (format 10, created by Subversion 1.6)问题。

原因应该是,版本太旧了。相当于我在低版本时候checkout了项目。需要升级。

终端:svn upgrade  就可以了。

相关svn工具也需要升级

十五、"library not found for - "解决办法  

解决办法:http://lizi464789754.blog.163.com/blog/static/168937085201411134123538/

 

 

待续。。。

iOS开发---- 开发错误汇总及解决方法