iOS开发--OC篇&经常使用问题解答

一:旧版本新浪微博 SDK 在 iOS9 上会致使的 Crash

app was compiled with optimization - stepping may behave oddly; variables may not be available

打印出来这句话,而后崩溃。可能是启动的过程当中程序就崩溃。

在iOS9下,新浪微博SDK里面使用的 JSONKit 在部分机型可能致使崩溃。崩溃信息以下图。



解决:更新新浪微博SDK,新浪的SDK最新版作了对iOS9兼容。html

 

二:iOS9 下使用 Masonry 会引发崩溃的一种状况

咱们在使用时候一直将 leading 与 left 划为等号,这样作在 iOS8(及之前)上是正常的,但在 iOS9 上这样的观念可能会引发崩溃,好比:
 1 make.left.equalTo(self.mas_leading).offset(15); 
应该为:
 1 make.left.equalTo(self.mas_left).offset(15); 
同理 mas_training 也须要改成right

三:Xcode 升级后,旧的状态栏的样式设置方式会引发警告
: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
出错缘由:设置 app 的状态栏样式的时候,使用了旧的方式,在 info.plist 里面的 View controller-based status bar appearance 默认会为 YES,即便不设置也是 YES,但通常 iOS6 的时候为了设置状态栏样式,须要将其设为NO,iOS7,8也兼容,可是到了iOS9 就会报警告。

解决办法:
删除原先的设置代码,一般老的设置方式是这样的:
网络

 //设置状态栏的白色
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

删除的缘由见下:app

 // Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");

修改方式是在 Info.plist 文件中作以下修改:

将 View controller-based status bar appearance 删除(默认为 YES),或设置为YES:异步


对应的 plist 里的 XML源码:async

  •  UIViewControllerBasedStatusBarAppearance

看起来长这样:
测试


而后使用新的方式来实现状态栏的样式:atom

  • - (UIStatusBarStyle)preferredStatusBarStyle;
  • - (UIViewController *)childViewControllerForStatusBarStyle;
  • - (void)setNeedsStatusBarAppearanceUpdate

好比,你想将状态栏设置为白色,就能够这样写:

//设置状态栏的白色spa

 -(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

记得要 clean 下或者删除应用程序从新运行。

四:navigationController状态栏样式新的设置方法

若是你按照上面的方法设置了,但仍是不行。八成是 rootViewController 设置的问题,你必须设置 rootViewController,编译器才会去 rootViewController 中重载 preferredStatusBarStyle 方法。debug


另外当你在 appdelegate 中将 navigationController 设为 rootViewController 的时候:
1 self.window.rootViewController = self.navigationController;调试

由于 rootViewController 变为了 navigationController,你在 ViewController 里重写 preferredStatusBarStyle 方法是不会起做用的。因此最好的方法是

1  - (void)viewDidLoad
2 {
3     [super viewDidLoad];
4     self.title = @"微博@iOS程序犭袁";
5     self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
6 }

若是你仍是想重写 preferredStatusBarStyle 方法来达到做用,那最好使用分类来解决:

复制代码
 1 #import "UINavigationController+StatusBarStyle.h"
 2  
 3 @implementation UINavigationController (StatusBarStyle)
 4  
 5 - (UIStatusBarStyle)preferredStatusBarStyle
 6 {
 7     //also you may add any fancy condition-based code here
 8     return UIStatusBarStyleLightContent;
 9 }
10  
11 @end
复制代码


五:Xcode7 在 debug 状态下也生成 .dSYM 文件引发的警告
Xcode6 的工程升级到 Xcode7上来,会报警告:

这是 debug 编译时导出符号文件出现的告警,然而新建的Xcode7工程不会有该问题。

解决方法是让 debug 编译的时候不生成符号文件:


Xcode7 没法使用 8.x 系统的设备调试,一运行就报错 there is an intenal API error

Xcode7 调试 iOS8.x 的真机,须要确保项目名改成英文,中间含有中文会报错 there is an intenal API error
按照下面的步骤检查:
bulid settings -> packaging -> product name

六:使用了 HTML 的 iframe 元素可能致使没法从 Safari 跳转至 App
咱们都知道,从网易新闻分享一条新闻到QQ,而后从QQ中打开连接再用safari打开连接,在iOS8上,这个时候会跳转到网易新闻App。可是如今(2015年09月23日)版本的网易新闻在 iOS9 就不能正常跳转,会跳转到 App Store 页面并提示要不要打开 App Store。

这是极可能是由于使用了 HTML 的 iframe 元素,并将自定义的连接放进了该元素中

举例说明:


我以前写的一个 Demo: 模仿 《简书 App》 的效果:在html中跳转到App中的对应页面,并能从App跳转到原来的网址,在例子中直接调用自定义连接在 iOS9上是能够跳转到 App 中的,然而,若是用 iframe 元素包起来就会变不可用。


七:iOS9锁屏控制台会打印警告
加入运行以下示例代码:

复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^(void) {
        //在这个10秒内锁屏
         NSLog(@"准备休眠");
        sleep(10);
        NSLog(@"打印成功");
    });
}
复制代码

应用运行过程当中锁屏,老是会出现如下提示:

1 [UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action ->{
2     handler = remote;
3     info ={
4         (1) = 5;
5     };
6 }

当应用处于空闲状态时(无网络请求)锁屏对于用户而言并没有较大影响,可是当应用在执行某个异步任务时(好比下拉刷新一下列表)锁屏,从新解锁进入就可能会发现异步任务失败,控制台也会提示 Error 信息:

复制代码
1 [UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action ->{
2     handler = remote;
3     info ={
4         (1) = 5;
5     };
6 }
7 error in __connection_block_invoke_2: Connection interrupted
复制代码

以上状况不易复现,但确有发生。在 iOS8 系统下测试并未发现此问题。对此并未找到合理的解释和对应的解决办法,若是你有解决方法,欢迎提 PR !

相关文章
相关标签/搜索