IOS编程开发中的问题小结(一)


        做了一段时间的IOS开发,在开发过程中遇到了一些问题,不一定具有代表性,只是作为个人开发学习过程中的一个小结吧。

        1.关于苹果系统对于应用系统启动时间的限制

        我们知道,iOS APP的最长启动时间不得超过15秒。如果超过了这个限制,APP会被App Store拒之门外。但是,有时候你也会发现通过了App Store审核的APP也会因为启动时间过长被系统杀掉,为什么呢?有时候你用xcode连接运行时程序运行正常,但断开xcode运行时程序也会因此被系统杀掉,又是为什么呢?

        对于第一个问题,很有可能是因为你的初始化操作里面包含了需要网络回应的操作,如果网络没有回应,或是回应超时,都会导致程序被终结。而App Store审核时不可能考虑所有网络的问题。还有可能是因为苹果审核测试时只是重点审核该应用在新机器、新版本下的运行情况,并不关注老系统,这就可能导致新机器新系统的启动时间在15秒内,但对于老系统,老机器就超出了这个限制。所以,我们在测试时要尽可能的覆盖测试。  

       所以我们在程序初始化启动时应尽量少做操作或不做操作,如果在加载根视图时确实要进行某些操作,可以将操作放在viewDidAppear中进行。     

        对于第二个问题,iPhone的系统在程序启动时使用一个看门狗定时器,一旦发现程序花费太长的时间用来初始化启动程序,系统会终结程序,当xcode启动程序时,看门狗定时器会因为xcode在attach到debugger上而失效。

       2.关于苹果系统对于应用程序内存使用的限制

       一般来说,对于不同硬件配置的机型,具有不同的内存使用限制。而且某一程序能够使用的内存大小,也与当前系统的可能内存有直接关系。在系统的应用程序打开过多时,可能此应用程序就会收到系统的内存警告。Apple也没有说自己的内存管理规则,也不告诉你iOS系统在运行时所占的空间、后台保留程序的内存保有量,App运行时,并不是一定要把资源全部加载到内存,App运行时真正在内存中占的空间是动态的,它能够使用的内存也是动态。根据开发经验来说,应用程序的动态开辟的内存不要超过20M ,这只是个经验值,并不是说应用程序内存使用超过了20M就一定会收到内存警告或崩溃。     

        3.关于应用程序闪退的问题

        对于应用程序闪退的原因,网上说了很多,这里整理了下。

       ①操作了不该操作的对象,野指针之类的。 
       ②对内存警告处理不当。 
       ③主线程UI长时间卡死,被系统杀掉。 
       ④程序内部异常逻辑没处理好。 
       ⑤sdk版本差异没处理好。

       ⑥在新 iOS 上正常的应用,到了老版本 iOS 上秒退最常见原因是系统动态链接库或Framework无法找到。这种情况通常是由于 App 引用了一个新版操作系统里的动态库(或者某动态库的新版本)或只有新 iOS 支持的 Framework,而又没有对老系统进行测试,于是当 App 运行在老系统上时便由于找不到而秒退。解决办法是等开发人员发现这个问题后升级程序,或由用户自行升级其操作系统

       ⑦程序在升级时,修改了本地存储的数据结构,但是对用户既存的旧数据没有做好升级,结果导致初始化时因为无法正确读取用户数据而秒退。这类问题通常只需删除程序后重新安装一遍就能解决。但缺点是用户的既存数据会丢失——就算有备份可能也无济于事,因为备份下来的旧数据还是无法被正确升级。

       ⑧还有一类秒退或是用到 App 里某个功能后必退的原因,是开发时用到了只有新版操作系统才支持的某个方法,而又没有对该方法是否存在于老系统中做出判断。例如程序启动时用到了 Game Center,而没有判断用户的机器是否支持 Game Center,于是就秒退了。

       4.应用程序崩溃的一个特例

       笔者在程序开发的过程中,曾经遇到过这样一个崩溃情况:应用程序在系统内存使用过多时(如开了很多的应用程序),当程序从子视图返回父视图时,点击父视图上某一UI控件时,程序崩溃,这种崩溃的情况还不容易复现。最开始以为是内存泄露导致的,使用Analyze还有Profile中的Leaks进行分析,排除了所有的内存泄露点还是没解决。后来才知道,原来是didReceiveMemoryWarning函数出现了问题。didReceiveMemoryWarning是在应用程序收到内存警告时会自动执行,回收内存。在didReceiveMemoryWarning中,对于当前页面的资源进行了释放。当从子视图返回时,虽然父视图依然予以了显示,但这些控件资源已经释放了,点击就会造成崩溃。

       5.关于应用程序在系统处于超频时的问题

       笔者在开发过程中遇到过这样的情况,应用程序系统在跳到某一页面时,该页面上的按钮控件可以正常点击,但是TextField等控件的点击后要等很长一段时间后才能响应,但是程序并没有崩溃。后来在Show the Debug Navigator中观察才知道,程序此时处于超频状态,导致系统无法及时响应。经过排查,发现是使用了系统的延时等待函数dispatch_after,使得系统CPU使用率一下就上去了。

       6.关于C/C++,Objective-C混合编程的问题。

       在做C/C++,Objective-C混合编程时曾遇到过这样一个问题:程序出现了incorrect checksum for freed object - object was probably modified after being freed的错误。从字面上的意思是对象在释放后又被修改了。解决此问题的思路如下:首先,通过设置“僵尸”断点的方式找到了出错的地方,但是找到的是在函数执行的末尾,并没有说明是哪个对象出现了问题;没办法,只能进行第二步,将该函数所有的对象释放语句选择性屏蔽掉,检查具体是哪个对象的问题,但可惜屏蔽掉该函数所有对象释放语句还是报错;所以将这种检查方式延续到该函数的子函数中,终于找到了出现问题的对象,发现是NSDateFormatter对象(后来才知道,这个对象会很影响应用程序的性能,要尽量避免使用,不过,这和此处的问题无关)。我是在C++类函数中创建初始化了这个对象,并调用了对象的方法,但没有释放,因为整个工程设置为了ARC,不能使用release,但问题可能就出在系统的自动释放池释放该对象的时机不对上面了。后来,我在OC对象的函数中创建这个对象获取到系统时间,然后通过全局变量的方式传到了C++类函数中使用解决了这一问题。       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值