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 !

相關文章
相關標籤/搜索