自己开发过程中遇到过很多错误,但一直没有整理记录,今天开始遇到问题就整理记录下,方便以后使用。
一. cocoapods 添加第三方库,第三方库支持版本问题
ld: embedded dylibs/frameworks are only supported on iOS 8.0
and later (@rpath/AFNetworking.framework/AFNetworking) for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我出现上面的情况注意是因为,用了 Cocoapods
安装的第三方框架.
原因:
主要是因为XXX的framework支持的最低开发环境为8.0
,而使用该framework的工程支持版本为8.0
以下
解决方法:
首先选中 pods
如图:
然后修改支持的最低版本: 如图:
二. 证书和id 不对应. 替换本地描述文件方法.
CodeSign error: code signing is required for product type
'Application' in SDK 'iOS 9.3'
原因:
签名证书不对
解决方法:
-
>Build Settings -> Code Signing -> Code Signing Identity -> Debug -> Any ios SDK
将选项改为:iPhone Developer
- 如果上面还不对,就自己去网站上 看看对应的ID和证书,描述文件是否都对.(我一般就直接去对id证书和描述文件.)
注意:
有时候你即使重新下载描述文件之后也还是错的,为什么呢,因为本地的描述文件还没有替换掉。这种情况经常出现在,新添加一个设备之后,要更新网上和本地的描述文件之后才能真机测试,这个时候老是提示描述文件找不到设备,这个时候就要删掉原先的描述文件,替换成刚在网上下载下来的.具体步骤如下:
-
找到你要删掉的描述文件,选中 点击下面的
other
按钮 如图:
-
在弹出的框中,记住这一串字符.
-
打开
Finder
按快捷键command+shift+G
,在弹出框中输入如下地址:/Users/youMacName/Library/MobileDevice/Provisioning Profiles
-
找到你刚才记住的那串字符,并删除
再次打开
Xcode
快捷键command+shift+K
clean 一下项目,双击你重新下的描述文件,运行,如果有别的错,应该就是下面记录的第四个错误4
,看看如何搞就行 ...
三. 真机测试 id 不对应问题
The provisioning profile specified in your build settings
(“WeiDeveloper”) has an AppID of “xxx.xxx.xxx” which does not
match your bundle identifier “zzz.zzz.zzz”.
原因:
修改了证书和描述文件,对应的id没有替换,或者没有替换全.
解决方法:
全局搜索 zzz.zzz.zzz
替换成 xxx.xxx.xxx
四. 更新 证书问题
Your build settings specify a provisioning profile with the UUID
“53cfe973-7bf2-414e-9942-f872469bb563”,
however, no such provisioning profile was found.
原因:
更换描述文件,出现的错误,一般项目更换描述文件之后就会报这个错
解决方法:
- 关闭项目,找到项目文件
XXXX.xcodeproj
,在文件上点击右键,选择显示包内容
(Show Package Contents)。会新打开一个Finder。 - 在新打开的
Finder
中找到project.pbxproj
,并且打开,找到你所有包含报错的UUID‘XXX’
的行(一般有多行),删除。 - 保存,重新启动项目,再编译,就OK了。(一定要重新启程xcode)
五. tableview 嵌套 collectionview 时 item size 问题
CollectionView[62853:1528710] the behavior of the
UICollectionViewFlowLayout is not defined because:**
CollectionView[62853:1528710] the item height must be less
than the height of the UICollectionView minus the section insets
top and bottom values, minus the content insets top and bottom
values.**
CollectionView[62853:1528710] The relevant
UICollectionViewFlowLayout instance is
原因:
UICollectionViewFlowLayout
的itemSize
的宽或者高设置的有问题!它的size必须在父容器的范围之内!也就是说相等也不行!我遇到这个警告主要是在UITableView
中嵌套了UICollectionView
,在tableview协议方法中heightForRowAtIndexPath
,和collectionview 协议方法中sizeForItemAtIndexPath
他俩设置的高度一样.
解决方法:
在sizeForItemAtIndexPath
中调小高度,警告就没有了.
六. 数组插入数据为nil
***** -[__NSArrayM insertObject:atIndex:]: object cannot be nil**
原因:
看意思就明白了,插入的元素为nil了
解决方法:
这个自己去找 ......
七. xib 中出现多余连线
this class is not key value coding-compliant for the key new_logView.'
原因:
自己在xib中设置IBAction和IBOutlet时有多余的连线
解决方法:
找到错误中提到的view,删除多余的连线.
八: UIButton 加定时器 字体闪烁
iOS NSTimer定时刷新按钮的文字,避免按钮闪烁的办法
错误效果:
由于使用xib拖得视图,没有更换btn的类型.
解决方法:
将UIButton
的类型由system
改为custom
就OK
九: collectionview 的问题 下面俩都是 插入/删除/的时候出现的问题
Invalid update: invalid number of items in section 0. The number
of items contained in an existing section after the update (11)
must be equal to the number of items contained in that section
before the update (7), plus or minus the number of items inserted
or deleted from that section (1 inserted, 0 deleted) and plus or
minus the number of items moved into or out of that section (0 moved in, 0 moved out).
原因:
- 这个问题出现的时候头疼了一会,因为我看代码怎么看怎么对,也是没谁了.
后来才发现还是自己代码的问题,最重要的一句话The number of items contained in an existing section after the update (11) must be equal to the number of items contained in that section before the update (7)
大概意思就是,更新前的数据源个数和更新后的不一样了,更新前7个,更新后11个,发现代码写的有问题,我把删除item的代码,写到else外面去了,先插入后删除 ~ ~ ~ 本来应该是插入就完事了,没想又走了一个删除的方法,先给自己一巴掌 ~~~ - 还要说一种情况.当你向一个空数组里面(个数为0的数组),调用
inster
方法,插入数据的时候,该数组个数不能为0 ~ 如果为0也会出现这个种情况~
解决方法:
把删除的方法放到else里面就没事了 ~~~
-
解决方法(当要插入的数组个数为0时,直接调用刷新方法) :
if (self.youList.count == 0 ) //要插入数据的数组 { [self.cusCollectionView reloadData]; }else { [self.cusCollectionView performBatchUpdates:^{ [self.cusCollectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:CUSTOM_SERVICE.selectedServiceId.count-1 inSection:0]]]; } completion:nil]; }
当然出现这个问题的情况肯定是不一样的,认真阅读下错误信息,就可以.一般都是数据源在搞鬼~
十:
**reason: 'attempt to insert item 10 into section 0, but there are
only 10 items in section 0 after the update'**
原因:
我出现上面的错误,是在使用collectionview过程中,向第0个section中,插入数据[self.cusCollectionView insertItemsAtIndexPaths:[NSArray arrayWithObject:indexPaths]];
插入第10个元素,但是第0个section元素最多10个,最大row值为9,所有奔溃.
解决方法:
后来发现是在插入前没有及时更新源数据.更新源数据之后问题就没有了.
十一: 被除数为0的错误提示
exc_arithmetic xcode (code = exc_i386_div,subcode = 0x0)
原因:
这种情况一般都是 被除数为0 . 有的时候看到这种错误,是不是很头疼?不知道该怎么办呢 ~ (还是修为不够,一直在路上~ ~ ~ )
解决方法:
找到报错的那行,看看被除数的数值.修改一下 ~
十二: 字符为nil
[NSNull componentsSeparatedByString:]: unrecognized selector sent to instance
原因:
返回的字符为nil或 "
解决方法:
加好判断,再处理~ 一般
if(![str isKindOfClass:[NSNull class] ] && str != nil)
十二:
App Transport Security has blocked a cleartext HTTP (http://)
resource load since it is insecure. Temporary exceptions can be
configured via your app's Info.plist file.
十三:
**reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'**
原因:
应该是 初始化字典的时候value值为nil了,大部分都是@{key:value,key:value}
这种方式出现的错误.
解决方法:
如果你还想用@{key:value,key:value}
这种方式最好先判断value
是否为nil
,或者换其他的初始化方法,其它的一般value
数据为nil
的时候,不会添加到字典,取值的时候,尽量不要用[ ]
这种方式去取值,尽量使用objectForKey
即使取出来的值为nil
,也不会奔溃,只是一个nil
对象.
十四: cell 为nil
** 'UITableView (; layer = ; contentOffset:
{0, 0}; contentSize: {375, 3868.5074999988824}>) failed to obtain a cell
from its dataSource ()'**
原因:
出现这个错误是加了一个新的cell
之后报的错误,不加的时候是没有错的,感觉是自己代码写的不规范.出现的原因是cell
为nil
,还去调用cell中的属性并赋值
解决方法:
仔细查看代码,加载cell
之前要判断好cell
是否为nil
,如果不想判断的话,建议实例化tableview
的时候使用如下方法加载 cell
这样就不用再去判断cell
是否为nil
:
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
- (void)registerNib:(nullable UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
十五 缺少库文件
ld: library not found for -lcrypto
原因:
一般 lcrypto
和 -lssl
都是没有找到 libssl.so,或第三方中的libssl.a文件
解决方法:
添加上库就可以了.
十六 编译报错: ld: symbol(s) not found for architecture x86_64
原因:
- 缺少文件的引用,上图就是缺少文件的引用
"_OBJC_CLASS_$_SkyServiceModel", referenced from:
这句话可以看出. - 还用一种可能是缺少文件,同上一样
"_OBJC_CLASS_$_SkyServiceModel", referenced from:
可以看出.
具体是缺少哪一个就要自己在项目,查看并添加了 ~
解决方法:
自己去查看上文中提到的文件,是缺少引用还是文件.然后去修改.我这里是SkyServiceModel
是写到一个manager
中,在.m
中没有 @implementation SkyServiceModel
(啪啪,谁打的我好疼啊~)编译的时候没有通过才报的错误.
十七 同时对同一个数组进行了操作: Collection <__NSCFArray:0x7fb212429b10> was mutated while being enumerated.
原因:
举例来说:
//错误用法 (for arrayTemp 同时在里面对 它进行 删除操作)
NSMutableArray * arrayTemp = xxx;
for (NSDictionary * dic in arrayTemp) {
if (condition){
[arrayTemp removeObject:dic];
}
}
解决方法:
NSMutableArray * arrayTemp = xxx;
NSArray * array = [NSArray arrayWithArray: arrayTemp];
for (NSDictionary * dic in array) {
if (condition){
[arrayTemp removeObject:dic];
}
}
十八 数据库语言错误:
DB Error: 1 "near "": syntax error"*
DB Error: 1 "near "": syntax error"*
原因:
出现这种结果的话,主要是sql 语句识别出错,或者是出现乱码
可以打印出具体的sql语句来查找原因。
栗子:
正确的语句:
insert into TEST (name, userId) values(@"中国", @"123")
错误语句:
insert into TEST (name, userId) values(@"中国", @"*&^#$")
解决方法:
查看sql中是否有乱码或内容格式是否有问题.
十九 Reason: image not found
原因:
出现这种情况一般都是第三方库找不到.
有人说把对应的 framework 改为 optional ,就可以运行。但这是治标不治本,代码运行到对应的framework 引用的地方,还是会崩溃。
解决方法: