android闪退原因 ios
2017-01-20 14:59:30 xinkongqiSHF 阅读数 874

iOS程序闪退是一种比较常见的现象。闪退的情况很多,造成程序闪退的原因也很多。

================================启动时闪退===================================

   情况一: 秒退是发生在程序刚刚启动的时候,在开发、苹果审核阶段都没有被发现的最大可能性就是,这个问题只会发生在老版系统、老版机型上。

 出现原因: 对于很多开发者,进行所有 iOS 版本,所有 iOS 机型覆盖测试是有难度的,苹果审核时也只是重点审核该应用在新机器、新版本下的运行情况,并不关注老系统。所以这也就是为什么会秒退的程序竟然

                也能通过苹果的审核。

解决办法:   公司提供一套测试机,全面测试,提高用户体验,防止用户流失。

***********************************************************************************

   情况二:苹果官方审查力度加大,导致代码或者数据库更新,或者项目中使用的第三方代码已经不适合当前的苹果官方的审查门槛。

出现原因:在新 iOS 上正常的应用,到了老版本 iOS 上秒退最常见原因是系统动态链接库或Framework无法找到。这种情况通常是由于 App 引用了一个新版操作系统里的动态库(或者某动态库的新版本)或只有

               新 iOS 支持的 Framework,而又没有对老系统进行测试,于是当 App 运行在老系统上时便由于找不到而秒退。

解决办法:开发人员发现这个问题后升级程序,或由用户自行升级其操作系统。

*************************************************************************************

   情况三:系统升级,用户数据丢失导致

出现原因:程序在升级时,修改了本地存储的数据结构,但是对用户既存的旧数据没有做好升级,结果导致初始化时因为无法正确读取用户数据而秒退。这类问题通常只需删除程序后重新安装一遍就能解决。但缺点是

               用户的既存数据会丢失——就算有备份可能也无济于事,因为备份下来的旧数据还是无法被正确升级。

解决办法:如果旧数据非常重要,那么就需要联系开发人员要求其进行程序修正了。

*************************************************************************************

   情况四:iOS版本升级导致问题,用到 App 里某个功能后闪退。

出现原因:是开发时用到了只有新版操作系统才支持的某个方法,而又没有对该方法是否存在于老系统中做出判断。例如程序启动时用到了 Game Center,而没有判断用户的

               机器是否支持 Game Center,于是就秒退了。 

解决办法:做判断

*************************************************************************************

   情况五:内存占用过大,导致程序崩溃。

出现原因:诸如内存不足、BAD_ACCESS 这类问题通常不管在新旧 iOS 上都会存在,内存不足导致闪退,并不常见 ,因为这类问题造成的秒退通常都能在测试和审核阶段被发现

以下是当个应用程序能够使用的最大的内存空间。<来自StackOverFlow>

 =====================================程序崩溃导致闪退===============================================

  常见程序崩溃原因:

  1.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->没数据会崩溃,数据错误会崩溃。

  2.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->业务逻辑处理不当会导致崩溃。

  3.点击某个模块或者某个功能按钮,直接导致崩溃:编辑代码时无报错,编译时出错。---------------------->代码逻辑错误,或者存在闪退符号的代码。

      4.某对象无法解析每个方法,该方法没有实现。

      5.Bundle中加载不存在的资源。

=========================================程序崩溃的解决办法==========================================

一:写个方法打印崩溃日志

 程序出现异常,要获得出错的原因,测试时可以通过打印崩溃信息来查看,上线后,要把用户的崩溃日志文件上传到服务器,以待处理。

    1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作。

       NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

    2. 实现自己的处理函数

       void UncaughtExceptionHandler(NSException *exception) {

    NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
    NSString *reason = [exception reason];//非常重要,就是崩溃的原因
    NSString *name = [exception name];//异常类型
      //打印错误信息:
    NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
}

二,程序中集成友盟。

友盟可以帮我们了解应用趋势、渠道分析、留存分析、行为分析、用户属性、错误分析。其中的错误分析,可以帮我们找到问题的根源。

应用趋势
清晰展现应用的新增用户、活跃用户、启动次数、版本分布、行业指标等数据,方便您从整体掌控应用的运营情况及增长动态。
渠道分析

在哪里推广最有效?从哪里获取的用户最有价值?友盟统计渠道分析功能可以实时查看各渠道的新增用户、活跃用户、次日留存率等用户指标,通过数据对比评估不同渠道的用户质量和活跃程度,从而衡量推广效果。

留存分析

您可以掌握每日(周/月)的新增用户在初次使用后一段时间内的留存率,留存率的高低一定程度上反映了产品和用户质量的好坏。

行为分析

针对性地进行应用内的数据统计,了解用户的产品使用细节及行为特征,帮助您寻找产品改进的突破点,评估产品优化的效果。

用户属性

用户的基本属性和行为特征,帮助您全面了解用户。

错误分析

收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。

2017-08-26 17:22:12 qq_33608748 阅读数 476

点击某界面闪退:用真机测试并在工程里打断点


一般性的应用闪退,主要是由于应用软件与手机系统偶发,临时性的故障,通常可以通过把应用软件从后台退出来解决。连接按下二次“主屏Home”键,即可打开后台多任务管理界面。(把后台应用删除)如果在不行就关机重启

1)该程序与你的操作系统不兼容, 建议使用更低或更高版本的程序或操作系统

2该程序的CPU或内存用量过高导致系统关闭程序。

3程序自身问题,建议使用更低或更高版本的程序。

4使用第三方软件安装的程序会出现闪退(弹窗)的问题,使用第三方软件修复,并在iOS设备中注销Apple帐号即可。

5)手机内存不足(低内存)。


2017-06-01 16:05:46 qq_22650377 阅读数 3705

iOS程序闪退的原因以及处理办法

iOS程序闪退是一种比较常见的现象。闪退的情况很多,造成程序闪退的原因也很多。

================================启动时闪退===================================

   情况一: 秒退是发生在程序刚刚启动的时候,在开发、苹果审核阶段都没有被发现的最大可能性就是,这个问题只会发生在老版系统、老版机型上。

 出现原因: 对于很多开发者,进行所有 iOS 版本,所有 iOS 机型覆盖测试是有难度的,苹果审核时也只是重点审核该应用在新机器、新版本下的运行情况,并不关注老系统。所以这也就是为什么会秒退的程序竟然

                也能通过苹果的审核。

解决办法:   公司提供一套测试机,全面测试,提高用户体验,防止用户流失。

***********************************************************************************

   情况二:苹果官方审查力度加大,导致代码或者数据库更新,或者项目中使用的第三方代码已经不适合当前的苹果官方的审查门槛。

出现原因:在新 iOS 上正常的应用,到了老版本 iOS 上秒退最常见原因是系统动态链接库或Framework无法找到。这种情况通常是由于 App 引用了一个新版操作系统里的动态库(或者某动态库的新版本)或只有

               新 iOS 支持的 Framework,而又没有对老系统进行测试,于是当 App 运行在老系统上时便由于找不到而秒退。

解决办法:开发人员发现这个问题后升级程序,或由用户自行升级其操作系统。

*************************************************************************************

   情况三:系统升级,用户数据丢失导致

出现原因:程序在升级时,修改了本地存储的数据结构,但是对用户既存的旧数据没有做好升级,结果导致初始化时因为无法正确读取用户数据而秒退。这类问题通常只需删除程序后重新安装一遍就能解决。但缺点是

               用户的既存数据会丢失——就算有备份可能也无济于事,因为备份下来的旧数据还是无法被正确升级。

解决办法:如果旧数据非常重要,那么就需要联系开发人员要求其进行程序修正了。

*************************************************************************************

   情况四:iOS版本升级导致问题,用到 App 里某个功能后闪退。

出现原因:是开发时用到了只有新版操作系统才支持的某个方法,而又没有对该方法是否存在于老系统中做出判断。例如程序启动时用到了 Game Center,而没有判断用户的

               机器是否支持 Game Center,于是就秒退了。 

解决办法:做判断

*************************************************************************************

   情况五:内存占用过大,导致程序崩溃。

出现原因:诸如内存不足、BAD_ACCESS 这类问题通常不管在新旧 iOS 上都会存在,内存不足导致闪退,并不常见 ,因为这类问题造成的秒退通常都能在测试和审核阶段被发现

以下是当个应用程序能够使用的最大的内存空间。<来自StackOverFlow>

 =====================================程序崩溃导致闪退===============================================

  常见程序崩溃原因:

  1.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->没数据会崩溃,数据错误会崩溃。

  2.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->业务逻辑处理不当会导致崩溃。

  3.点击某个模块或者某个功能按钮,直接导致崩溃:编辑代码时无报错,编译时出错。---------------------->代码逻辑错误,或者存在闪退符号的代码。

      4.某对象无法解析每个方法,该方法没有实现。

      5.Bundle中加载不存在的资源。

=========================================程序崩溃的解决办法==========================================

一:写个方法打印崩溃日志

 程序出现异常,要获得出错的原因,测试时可以通过打印崩溃信息来查看,上线后,要把用户的崩溃日志文件上传到服务器,以待处理。

    1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作。

       NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

    2. 实现自己的处理函数

       void UncaughtExceptionHandler(NSException *exception) {

    NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
    NSString *reason = [exception reason];//非常重要,就是崩溃的原因
    NSString *name = [exception name];//异常类型
      //打印错误信息:
    NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
}


2019-03-05 14:40:12 Z1591090 阅读数 922

我自己也封装了一些安全接口的定义下载地址
https://download.csdn.net/download/z1591090/10997849

  1. 字典

(1):key或value为nil 会崩溃:
我下面所写的 NSDictionary *dic = @{@“key”: nil}; 大部分可能认为他会崩溃,非常小心, 如果是NSDictionary *dic = @{@“key”: str} 这种写法,大家有可能会忽略str是否为空,造成崩溃;
字典的key或value为nil,字典的key只要为nil任何写法一定会崩,当value为nil的时候,只有NSDictionary *dic = @{@“key”: nil}这种写法会崩, 例如mutableDic[@“key”] = nil 这种写法是不会崩的;

eg:
NSDictionary *dic = @{@"key": nil}; // 崩溃
  [mutDic setObject:nil forKey:@"key"]; // 不崩溃
 mutDic[@"key"] = nil;

 原理:
通过key值得到安全的value值,字符串(NSString)或数组(NSArray)数据为NUll 崩溃
解决方案
- (NSString *)stringForKey_zmm:(NSString *)key
{
    NSString *value = [self objectForKey_cmbc:key
                               withValueClass:[NSString class]];
    if ([NSString strNilOrEmpty_cmbc:value])
    {
        value = @"";
    }
    return value;
}

(2):当字典通过key取出的值已数组接收,但其实是字符串崩溃:

eg:
 NSDictionary *dic = @{@"key": @"a"};
 NSArray *arr = dic[@"key"];  // arr其实是字符串,但编译器不会报错
 NSLog(@"%@", arr[0]);        // 崩溃
解决方案
- (NSArray*)arrayForKey_zmm:(id)key
{
    id object = [self objectForKey:key];
    if (!object) { return nil; }
    if (![object isKindOfClass:[NSArray class]]) {
        object = [NSArray arrayWithObject:object];
    }
    
    return object;
}


- (id)objectForKey_zmm:(NSString *)key withValueClass:(Class)valueClass
{
    if (![key isKindOfClass:[NSString class]]) {
        return nil;
    }
    
    if (valueClass == NULL) {
        return nil;
    }
    
    id value = [self objectForKey:key];
    
    if (!value) {
        return nil;
    }
    
    if (valueClass == [NSArray class] && ![value isKindOfClass:[NSArray class]]) {
        return [NSArray arrayWithObjects:value, nil];
    }
    
    if (![value isKindOfClass:valueClass]) {
        return nil;
    }
    
    return value;

}

2.数组:index>数组的count造成崩溃
(1)数组越界崩溃

 eg:
 NSArray *array= @[@1, @2, @3];
 NSNumber *num = array[3]; // 崩溃
解决方案
方案:
- (id)objectAtIndex_zmm:(NSUInteger)index
{
    if (self.count == 0) {
        return nil;
    }
    if (index >= self.count) {
        return nil;
    }
    
    return [self objectAtIndex:index];
}

3.NSMutableArray(可变数组的取值和插入与删除)
``
解决方案`

  • (void)removeObjectAtIndex_zmm:(NSUInteger)index
    {
    if (self.count == 0) {
    return;
    }
    if (index >= self.count) {
    return;
    }
    [self removeObjectAtIndex:index];
    }

  • (void)addObject_zmm:(id)anObject
    {
    if (!anObject) {
    return;
    }
    [self addObject:anObject];
    }

  • (void)insertObject_zmm:(id)anObject atIndex:(NSUInteger)index
    {
    if (!anObject) {
    return;
    }
    if (index > self.count) {
    return;
    }
    [self insertObject:anObject atIndex:index];
    }

4、对于数组遍历
比如像需要遍历某个数组发通知,有两点需要注意。
第一,如果数组的内容可能被多个线程修改,则需要先将数组拷贝一份,对拷贝之后的数组进行遍历。这种方法可以避免在在遍历过程中,数组被其他修改,数组取值出现异常, 导致闪退。
第二,是如果这个数组是使用了unretain弱引用的话,由于数组的对象可能在遍历的过程中会被释放,一旦被释放,unretain的内容就会变成野指针,直接取值也会闪退。一定要先使用arrayWithArray生成一个NSArray对象,该对象会强引用对象,在遍历的过程中不会闪退。

eg: 某数组self.arr
NSArray *array = [NSArray arrayWithArray:self.arr];
[array enumerateObjectsUsingBlock:^(  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    
    }];

2.字符串
字符串不存在,判断字符串是否为空,

解决方案
+ (NSString *)safeGet_zmm:(NSString *)str
{
    if (!str) {
        return @"";
    }
    return str;
}
+ (BOOL)strNilOrEmpty_zmm:(NSString *)str
{
    if (!str||![str isKindOfClass:[NSString class]])
    {
        return YES;
    }
    return [str isStringEmpty_cmbc];
}

- (BOOL)isStringEmpty_zmm
{
    return (0 == self.length) ? YES : NO;

}

5.NSKeyedUnarchiver(归档关于数据类型)

+(nullable id)unarchiveObjectWithData:(nonnull NSData *)data objectType_zmm:(Class _Nullable )classObject
{
    @try {
        
        if (![data isKindOfClass:[NSData class]]) {
            return nil;
        }
        
        id result = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if (!classObject || [result isKindOfClass:classObject]) {
            
            return result;
        }
        
        return nil;
    }
    @catch (NSException * e) {
        
        return nil;
    }
}
  1. 用try - catch
    对于一些c类使用,有时抛出的异常崩溃,需要把某段逻辑写到try里面;一些由于个别业务,触发的某种异常处理,也需要把代码写到try里。
    @try {
    } @catch (NSException *exception) {
    } @finally {
    }

7.还有权限
****控制台报忠告:

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.****

大致意思就是:App缺少一个获取私有数据的权限描述,需要我们在info.plist文件中必须含有一个名字叫做NSPhotoLibraryUsageDescription的值来解释为什么应用需要使用这个数据,没错,获取相册资源的键值就是NSPhotoLibraryUsageDescription

通过类似事情,说明iOS10对用户的隐私又做了进一步加强,就好像当初iOS8对定位隐私进行加强一样,作为开发者的我们貌似也是应该时刻保持这种对新知识警觉性的。

除了相册的权限,iOS10之后如下的权限请求也是需要我们填写请求描述的,在这里也给大家提醒一下:

Privacy - Microphone Usage Description //麦克风权限
Privacy - Contacts Usage Description   //通讯录权限
Privacy - Camera Usage Description     //摄像头权限
Privacy - NSSiriUsageDescription       //Siri的权限
Privacy - Bluetooth Peripheral Usage Description //蓝牙
Privacy - Reminders Usage Description  //提醒事项
Privacy - Motion Usage Description     //运动与健康
Privacy - Media Libaray Usage Description //媒体资源库
Privacy - Calendars Usage Description  //日历

内存溢出或泄露,分为下面几个方面

  1. 定时器没有释放或通知没有移除,或者循环引用,造成界面无法释放,内存增加

  2. 在for循环创建了很多局部变量,当遍历次数过多时造成内存急剧增加,崩溃, 可以通过添加@autoreleasepool解决;

eg:
for (int i = 0; i < 5000000; i++) {
     NSObject *obj = [[NSObject alloc] init];  // 内存暴增,局部变量没有释放
 }
 解决方案
 for (int i = 0; i < 5000000; i++) {
     @autoreleasepool {
         NSObject *obj = [[NSObject alloc] init];  // 内存减少, 运行时间差不多
     }
 }

  1. 绘制图片,占用内存过大,例如UIGraphicsGetImageFromCurrentImageContext()这些方法绘制大图片,或者加载大量高清晰体积大的图片
  2. 调用一些公司用C或C++语言写的静态库,由于不能对他们进行垃圾回收,造成内存泄露或溢出,用Instruments 来检查一下,如果你的项目是要支持长时间运行的,一定要仔细观察一下;
  3. 调用底层C语言框架,没对变量进行释放,造成内存泄露;

13.截取字符串、数组、NSData越界

 NSString *str = @"abcdefg";
 [str substringWithRange:NSMakeRange(0, 8)]; // 崩溃
解决方案:

1.判断一下range是否超了字符串的总长度
2.用抓取异
  @try {
NSString   * resultString = [str substringWithRange:range];
  } @catch (NSException *exception) {
 NSString   * resultString = @"";
     } @finally {
                    
     }  

14.多个按钮同时点击造成崩溃,在AppDelegate中设置[UIButton appearance].exclusiveTouch = YES, 避免按钮同时点击

2016-12-11 17:46:00 weixin_33859231 阅读数 3

iOS程序闪退的原因以及处理办法

 iOS程序闪退是一种比较常见的现象。闪退的情况很多,造成程序闪退的原因也很多。

================================启动时闪退===================================

   情况一: 秒退是发生在程序刚刚启动的时候,在开发、苹果审核阶段都没有被发现的最大可能性就是,这个问题只会发生在老版系统、老版机型上。

 出现原因: 对于很多开发者,进行所有 iOS 版本,所有 iOS 机型覆盖测试是有难度的,苹果审核时也只是重点审核该应用在新机器、新版本下的运行情况,并不关注老系统。所以这也就是为什么会秒退的程序竟然

                也能通过苹果的审核。

解决办法:   公司提供一套测试机,全面测试,提高用户体验,防止用户流失。

***********************************************************************************

   情况二:苹果官方审查力度加大,导致代码或者数据库更新,或者项目中使用的第三方代码已经不适合当前的苹果官方的审查门槛。

出现原因:在新 iOS 上正常的应用,到了老版本 iOS 上秒退最常见原因是系统动态链接库或Framework无法找到。这种情况通常是由于 App 引用了一个新版操作系统里的动态库(或者某动态库的新版本)或只有

               新 iOS 支持的 Framework,而又没有对老系统进行测试,于是当 App 运行在老系统上时便由于找不到而秒退。

解决办法:开发人员发现这个问题后升级程序,或由用户自行升级其操作系统。

*************************************************************************************

   情况三:系统升级,用户数据丢失导致

出现原因:程序在升级时,修改了本地存储的数据结构,但是对用户既存的旧数据没有做好升级,结果导致初始化时因为无法正确读取用户数据而秒退。这类问题通常只需删除程序后重新安装一遍就能解决。但缺点是

               用户的既存数据会丢失——就算有备份可能也无济于事,因为备份下来的旧数据还是无法被正确升级。

解决办法:如果旧数据非常重要,那么就需要联系开发人员要求其进行程序修正了。

*************************************************************************************

   情况四:iOS版本升级导致问题,用到 App 里某个功能后闪退。

出现原因:是开发时用到了只有新版操作系统才支持的某个方法,而又没有对该方法是否存在于老系统中做出判断。例如程序启动时用到了 Game Center,而没有判断用户的

               机器是否支持 Game Center,于是就秒退了。 

解决办法:做判断

*************************************************************************************

   情况五:内存占用过大,导致程序崩溃。

出现原因:诸如内存不足、BAD_ACCESS 这类问题通常不管在新旧 iOS 上都会存在,内存不足导致闪退,并不常见 ,因为这类问题造成的秒退通常都能在测试和审核阶段被发现

以下是当个应用程序能够使用的最大的内存空间。<来自StackOverFlow>

 =====================================程序崩溃导致闪退===============================================

  常见程序崩溃原因:

  1.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->没数据会崩溃,数据错误会崩溃。

  2.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。---------------------->业务逻辑处理不当会导致崩溃。

  3.点击某个模块或者某个功能按钮,直接导致崩溃:编辑代码时无报错,编译时出错。---------------------->代码逻辑错误,或者存在闪退符号的代码。

      4.某对象无法解析每个方法,该方法没有实现。

      5.Bundle中加载不存在的资源。

=========================================程序崩溃的解决办法==========================================

一:写个方法打印崩溃日志

 程序出现异常,要获得出错的原因,测试时可以通过打印崩溃信息来查看,上线后,要把用户的崩溃日志文件上传到服务器,以待处理。

    1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作。

       NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

    2. 实现自己的处理函数

       void UncaughtExceptionHandler(NSException *exception) {

    NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
    NSString *reason = [exception reason];//非常重要,就是崩溃的原因
    NSString *name = [exception name];//异常类型
      //打印错误信息:
    NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
}

二,程序中集成友盟。

友盟可以帮我们了解应用趋势、渠道分析、留存分析、行为分析、用户属性、错误分析。其中的错误分析,可以帮我们找到问题的根源。

应用趋势
清晰展现应用的新增用户、活跃用户、启动次数、版本分布、行业指标等数据,方便您从整体掌控应用的运营情况及增长动态。
渠道分析

在哪里推广最有效?从哪里获取的用户最有价值?友盟统计渠道分析功能可以实时查看各渠道的新增用户、活跃用户、次日留存率等用户指标,通过数据对比评估不同渠道的用户质量和活跃程度,从而衡量推广效果。

留存分析

您可以掌握每日(周/月)的新增用户在初次使用后一段时间内的留存率,留存率的高低一定程度上反映了产品和用户质量的好坏。

行为分析

针对性地进行应用内的数据统计,了解用户的产品使用细节及行为特征,帮助您寻找产品改进的突破点,评估产品优化的效果。

用户属性

用户的基本属性和行为特征,帮助您全面了解用户。

错误分析

收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。

转载于:https://www.cnblogs.com/JL0797/p/6160071.html

ios程序闪退

阅读数 21

IOS闪退信号

阅读数 287

没有更多推荐了,返回首页