阅读 449

iOS开发常见问题之综合篇

编译失败

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

关注下面的标签,发现更多相似文章
评论