iOS開發常見問題之綜合篇

囧叔發表於2017-12-22

編譯失敗

Bundleid不匹配

如果證書都配置正確了,注意看看Target中是否有Test,Test的id是不是和證書一致。
複製程式碼

no such provisioning profile was found

分別嘗試用以下方法解決:
1.在證書和描述檔案有更新後,需要完全退出Xcode再開啟。
2.前往~/Library/MobileDevice/Provisioning Profiles,刪除描述檔案
3.Window-Devices,右鍵裝置Show Provisioning Profile,刪除描述檔案,刪除依賴這些描述檔案的App。
4.刪除Xcode的Device Data。
5.嘗試證書籤名配置那裡選Don't Code Sign,儲存,然後再選正確的證書。
複製程式碼

library not found for -l

注意檢查Build Settings的Library Search Paths和Other Linker Flags是否殘留有已刪除的庫配置。
複製程式碼

升級Xcode後,就編譯不了

未升級前還好好的專案,升級了Xcode後,就報Undefined symbols for architecture arm64...

嘗試刪除快取Device Data。
Preferences-Locations-Derived Data
下方有行小字顯示了它的路徑,末尾有個小小的右箭頭,點它進入資料夾
然後可以選中全部項,刪掉~~
複製程式碼

Pods的庫升級後編譯不了 或 .a檔案升級更換後編譯不了

清空Device Data。
複製程式碼

internal api error

在ios7真機除錯時,bundleName不能是中文,改為英文即可
複製程式碼

Use of undeclared identifier ‘sqlite_int64'

如果有用到FMDB的話,標頭檔案引入

#if FMDB_SQLITE_STANDALONE
#import <sqlite3/sqlite3.h>
#else
#import <sqlite3.h>
#endif
複製程式碼

Undefined symbols for architecture armv7

有時是因為更新了第三方庫導致的,把xcode的drivedata清除即可
複製程式碼

Xcode選不了模擬器,模擬器不見了

如果Target的SDK編譯版本高於Xcode模擬器支援的SDK版本,模擬器列表就會變成空,只需把Target的SDK版本選低點就好了。

執行中崩潰

[self becomeFirstResponder] 崩潰

成員變數中不可以有叫inputView的變數

Controller的updateViewConstraints崩潰

要先呼叫父類的updateViewConstraints,否則會崩潰

TableHeaderView約束崩潰

iOS7及以下TableHeaderView不可以設定與tableview關聯的約束,否則會crash。 我猜測是headerView由tableView自動管理,如果手動為headerView新增與tableView關聯的約束,會因衝突而crash。 ios8無此問題。

dispatch_semaphore崩潰

當某個dispatch_semaphore_t正處於dispatch_semaphore_wait的時候,釋放這個dispatch_semaphore_t的引用(sema = nil),將會導致崩潰。 示例:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.sema = dispatch_semaphore_create(0);
    
    // 每隔1秒釋放一個訊號量
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        dispatch_semaphore_signal(self.sema);
    }];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 模擬10個任務
        for (NSInteger index = 1; index <= 10; ++ index) {
            // 每個任務都需要等待到有訊號量才能開始
            dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER);
            NSLog(@"執行任務%@...", @(index));
        }
        
        // 全部任務執行完畢
        [timer invalidate];
    });
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesEnded");
    // crash!
    // 當某個dispatch_semaphore_t正處於dispatch_semaphore_wait的時候
    // 釋放這個dispatch_semaphore_t的引用,將會導致崩潰
    self.sema = nil;
}
複製程式碼

控制檯:

2016-11-22 16:01:50.520 SemaDemo[2990:136781] 執行任務1...
2016-11-22 16:01:51.482 SemaDemo[2990:136781] 執行任務2...
2016-11-22 16:01:52.495 SemaDemo[2990:136781] 執行任務3...
2016-11-22 16:01:53.209 SemaDemo[2990:136725] touchesEnded
複製程式碼

使用技巧

怎麼檢視真機沙盒目錄

開啟Xcode

頂部Window-Devices

檢視真機沙盒.png

儲存到桌面,右鍵顯示包內容就可以看到沙盒目錄了。

截圖16_9_12_16_19.png

相關文章