当前位置: 首页 > news >正文

如何快速提高网站权重/百度广告投放平台官网

如何快速提高网站权重,百度广告投放平台官网,七牛云上市,购物网站开发的必要性虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。 文/donglin 注:鉴于多名网友对文中代码提出的质疑,小编联系了作者&#…

虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。

文/donglin

注:鉴于多名网友对文中代码提出的质疑,小编联系了作者,迅速给予更正并更新。感谢大家的监督与支持!

虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。

IOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler 用来做异常处理,但功能非常有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了,因为这种错误它抛出的是Signal,所以必须要专门做Signal处理。首先定义一个UncaughtExceptionHandler类,.h头文件的代码如下:

#import <UIKit/UIKit.h>

@interface UncaughtExceptionHandler : NSObject

{

BOOL dismissed;

}

@end

void InstallUncaughtExceptionHandler();

 

然后在.mm文件实现InstallUncaughtExceptionHandler(),如下:

void InstallUncaughtExceptionHandler()

{

signal(SIGABRT, MySignalHandler);

signal(SIGILL, MySignalHandler);

signal(SIGSEGV, MySignalHandler);

signal(SIGFPE, MySignalHandler);

signal(SIGBUS, MySignalHandler);

signal(SIGPIPE, MySignalHandler);

}

 

这样,当应用发生错误而产生上述Signal后,就将会进入我们自定义的回调函数MySignalHandler。为了得到崩溃时的现场信息,还可以加入一些获取CallTrace及设备信息的代码,.mm文件的完整代码如下:

#import "UncaughtExceptionHandler.h"

#include <libkern/OSAtomic.h>

#include <execinfo.h>

NSString * const UncaughtExceptionHandlerSignalExceptionName = @"UncaughtExceptionHandlerSignalExceptionName";

NSString * const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey";

NSString * const UncaughtExceptionHandlerAddressesKey = @"UncaughtExceptionHandlerAddressesKey";

volatile int32_t UncaughtExceptionCount = 0;

const int32_t UncaughtExceptionMaximum = 10;

const NSInteger UncaughtExceptionHandlerSkipAddressCount = 4;

const NSInteger UncaughtExceptionHandlerReportAddressCount = 5;

@implementation UncaughtExceptionHandler

+ (NSArray *)backtrace

{

        void* callstack[128];

 int frames = backtrace(callstack, 128);

 char **strs = backtrace_symbols(callstack, frames);  

 int i;

 NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

 for (

  i = UncaughtExceptionHandlerSkipAddressCount;

  i < UncaughtExceptionHandlerSkipAddressCount +

UncaughtExceptionHandlerReportAddressCount;

i++)

 {

  [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];

 }

 free(strs);  

 return backtrace;

}

- (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex

{

if (anIndex == 0)

{

dismissed = YES;

}

}

- (void)handleException:(NSException *)exception

{

UIAlertView *alert =

[[[UIAlertView alloc]

initWithTitle:NSLocalizedString(@"Unhandled exception", nil)

message:[NSString stringWithFormat:NSLocalizedString(

@"You can try to continue but the application may be unstable.\n"

@"%@\n%@", nil),

[exception reason],

[[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]]

delegate:self

cancelButtonTitle:NSLocalizedString(@"Quit", nil)

otherButtonTitles:NSLocalizedString(@"Continue", nil), nil]

autorelease];

[alert show];

CFRunLoopRef runLoop = CFRunLoopGetCurrent();

CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);

while (!dismissed)

{

for (NSString *mode in (NSArray *)allModes)

{

CFRunLoopRunInMode((CFStringRef)mode, 0.001, false);

}

}

CFRelease(allModes);

NSSetUncaughtExceptionHandler(NULL);

signal(SIGABRT, SIG_DFL);

signal(SIGILL, SIG_DFL);

signal(SIGSEGV, SIG_DFL);

signal(SIGFPE, SIG_DFL);

signal(SIGBUS, SIG_DFL);

signal(SIGPIPE, SIG_DFL);

if ([[exception name] isEqual:UncaughtExceptionHandlerSignalExceptionName])

{

kill(getpid(), [[[exception userInfo] objectForKey:UncaughtExceptionHandlerSignalKey] intValue]);

}

else

{

[exception raise];

}

}

@end

NSString* getAppInfo()

{

    NSString *appInfo = [NSString stringWithFormat:@"App : %@ %@(%@)\nDevice : %@\nOS Version : %@ %@\nUDID : %@\n",

                          [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"],

                          [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"],

                          [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"],

                          [UIDevice currentDevice].model,

                          [UIDevice currentDevice].systemName,

                          [UIDevice currentDevice].systemVersion,

                          [UIDevice currentDevice].uniqueIdentifier];

    NSLog(@"Crash!!!! %@", appInfo);

    return appInfo;

}

void MySignalHandler(int signal)

{

int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount);

if (exceptionCount > UncaughtExceptionMaximum)

{

return;

}

NSMutableDictionary *userInfo =

[NSMutableDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:UncaughtExceptionHandlerSignalKey];

NSArray *callStack = [UncaughtExceptionHandler backtrace];

[userInfo

setObject:callStack

forKey:UncaughtExceptionHandlerAddressesKey];

[[[[UncaughtExceptionHandler alloc] init] autorelease]

performSelectorOnMainThread:@selector(handleException:)

withObject:

[NSException

exceptionWithName:UncaughtExceptionHandlerSignalExceptionName

reason:

[NSString stringWithFormat:

NSLocalizedString(@"Signal %d was raised.\n"

                                          @"%@", nil),

signal, getAppInfo()]

userInfo:

[NSDictionary

dictionaryWithObject:[NSNumber numberWithInt:signal]

forKey:UncaughtExceptionHandlerSignalKey]]

waitUntilDone:YES];

}

void InstallUncaughtExceptionHandler()

{

signal(SIGABRT, MySignalHandler);

signal(SIGILL, MySignalHandler);

signal(SIGSEGV, MySignalHandler);

signal(SIGFPE, MySignalHandler);

signal(SIGBUS, MySignalHandler);

signal(SIGPIPE, MySignalHandler);

}

 

在应用自身的 didFinishLaunchingWithOptions 前,加入一个函数:

- (void)installUncaughtExceptionHandler

{

InstallUncaughtExceptionHandler();

}

 

最后,在 didFinishLaunchingWithOptions 中加入这一句代码就行了:

[self InstallUncaughtExceptionHandler];

现在,基本上所有崩溃都能Hold住了。崩溃时将会显示出如下的对话框:

 

这样在崩溃时还能从容地弹出对话框,比起闪退来,用户也不会觉得那么不爽。然后在下次启动时还可以通过邮件来发送Crash文件到邮箱,这就看各个应用的需求了。

 

原文来自:触控科技博客

http://www.lbrq.cn/news/1303219.html

相关文章:

  • 个人做网站报价/网站推广推广
  • 自己做店铺网站/百度搜索的优势
  • 幼儿园网站怎么做的/项目外包平台
  • asp动态网站制作流程/上海野猪seo
  • 响应式网站排版/浑江区关键词seo排名优化
  • 做网站资源/建网站的公司排名
  • 上海网站建设公司 珍岛/百度网站排名关键词整站优化
  • 成都旅游景点攻略/山西seo排名厂家
  • wordpress 搜索 404/seo工具网站
  • 陕西网站建设托管/网站收录什么意思
  • 只建设电子商务网站不维护/点击排名软件哪个好
  • 哈尔滨工程信息网/百度 seo优化作用
  • 海南网站建设网站开发小程序app/软文是什么东西
  • 邯郸做wap网站找谁/html网页制作网站
  • 如何做外贸网站/产品软文范例大全
  • 网站建设页面生成/平台推广是做什么的
  • 手机网站安全证书过期怎么处理/站长之家怎么找网址
  • pc端网站生成wap版/网站视频播放代码
  • wordpress网站程序员/潍坊网站外包
  • 专门做视频的网站有哪些/百度怎么推广自己的信息
  • 江苏城乡住房和城乡建设厅网站/杭州百度推广代理商
  • 网站微信分享链接怎么做的/站长素材官网免费
  • 浙江省建设监理协会管网站/一句话宣传自己的产品
  • 网站维护费用包括哪些/如何搭建公司网站
  • 旅游网站的设计方案怎么做/贺贵江seo教程
  • 贵阳哪里可以做网站/网站设计制作哪家好
  • 两学一做学习网站/互联网营销
  • 深圳知名网站建设平台/b站免费版入口
  • 网站建设流程详细/seo搜索引擎优化课程总结
  • 总公司网站备案后 分公司网站还需要备案吗/怎么给自己的网站设置关键词
  • 目标框的位置以及大小的分布
  • 前端笔记之 async/await 异步编程详解
  • 图片上传实现
  • 我的开发日志:随机数小程序
  • 从零开发足球比分APP:REST API与WebSocket的完美搭配
  • MySQL 8.0 OCP 1Z0-908 题目解析(27)