1.字典
赋值
setObjectForKey key不能为nil,object不能为nil
setValueForKey key不能为nil,value可以为nil
dic[key] = value; key不能为nil,value可以为nil
Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.
取值
[dic objectForKey:key]; key可以为nil
[dic valueForKey:key]; key也可以为nil
在使用@{@”key”:value} 这种方式初始化的时候,一定要对value做是否为nil的判断,为nil就不要加入Dictionary,否则会挂
if (key.length > 0) {
[dic setValue:value forKey:key];
}
if ([arrKeys containsObject:key]) {
[dic setValue:value forKey:key];
}
或使用标准的初始化方法:
NSDictionary dictionaryWithObjectsAndKeys:value1,@"v1",value2,@"v2",value3,@"v3", nil];
或其它的几个初始化方法进行初始化,但是这个方法如果value为nil就初始化的字典也为nil,也是一个坑,你可能以为字典不为nil,仅仅是这个key和value不存在。
关联:
使用@[]方法初始化NSArray也有此坑,规避方法同字典一样
2.数组
取值
(1)取值范围越界
index 0 beyond bounds for empty NSArray
if(index < arr. count) {
[arr objectAtIndex:index];
arr[obj];
}
存值
(1)插入nil
attempt to insert nil object from objects[0]
(2)插入范围越界
index 1 beyond bounds for empty array
if(obj && index < arr. count) {
[arr insertObject:obj atIndex:index];
}
3. unrecognized selector sent to instance
(1)xib连线的方法未实现,第一次连线后代码中将方法删除,控件中没有删除
(2)代理未实现@optional代理方法
(3)响应 delegate 的VC,或者 View 的实例被提前释放了
解决方法:
if (self.delegate && [self.delegate respondsToSelector:@selector(xxx)])
4.Invalid parameter not satisfying: date
给datePicker赋值的NSDate为nil,可能因为日期格式化字符串不对,由dateFormatter生成的date为nil,尽量用系统方法计算日期。
解决方法:
if (date) {
_dpBirth.date = date;
}
5. Range or index out of bounds
构造range时,使用NSMakeRange时loc或者len越界,如果该range不使用也不会crash,在调用这两个方法时会crash:
substringWithRange:
replaceCharactersInRange:
解决方法:
if (loc < textString.length && len <= textString.length - loc) {
NSMakeRange(loc, len);
}
6. this class is not key value coding-compliant for the key lblBut.
控件属性重复拉线,一个控件拉出两个属性,删除其中一个
不可变字典调用了setValueForKey,调用方法前看清是不是可变字典
7.section (2) beyond bounds (1). row (1) beyond bounds (1) for section (0).'
手动创建NSIndexPath时row和section越界,如果该indexPath不使用也不会crash,在调用:
[_mainTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
解决方法:
根据tableView的属性和方法算出section和row的个数进行判断
@property (nonatomic, readonly) NSInteger numberOfSections;
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
if ([_mainTableView numberOfSections] > section && [_mainTableView numberOfRowsInSection:section] > row) {
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:row inSection:section];
}
8.延迟调用代理方法时delegate为nil(ios7)
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"xxx" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
[alert show];
[self performSelector:@selector(pop) withObject:nil afterDelay:2];
- (void)pop {
[self.navigationController popViewControllerAnimated:YES];
}
解决方法:
alertView如果不处理点击事件要将delegate设为nil,如果涉及到跳转的先处理完代理事件在跳转页面
9.kvo
(1).An instance of class ViewController was deallocated while key value observers were still registered with it
kvo没有移除监听,或者kvo多次注册监听
(2)Cannot remove an observer ViewController for the key path "key" from ViewController because it is not registered as an observer
移除的key和注册的key不一致,或者移除多次
解决方法:
确保注册一次要移除一次,不要重复注册,不要重复移除
10.block
(1).block作为属性时要用copy
@property (copy,nonatomic)block;
(2).调用block需要判断是否为空
if (block) {
block();
}
不然会报坏内存访问
11.Trapped uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer bounds contains NaN: [0 nan; 320 0]'
当用float接收的运算中分母为0,并将该结果放在CGRectMake、CGSizeMake或者CGPointMake中使用,计算结果不使用也不会crash,如果用nsinteger接收也不会crash
c = 0;
float a = b/c; (会crash)
NSInteger a = b/c; (不会crash)
CGRectMake(0,a,width,height);
解决方法:
进行运算时分母不能为0
12.使用高版本的api,如alertViewController(iOS8)
13.使用NSTimer 的target被释放了,而timer还去执行定时方法,回调的时候找不到对象就会挂掉
在viewWillDisappear里将[timer invalid],并将timer = nil;
14. Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UINavigationBar's implementation of -layoutSubviews needs to call super.'
原因:
再给导航栏设置left和rightItem时使用下面的方法在iOS7中可能出现闪退,原因未知。
UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] initWithCustomView:_btnBack];
self.navigationItem.leftBarButtonItem = leftBar;
解决方法:
使用下面的方法代替:
UIBarButtonItem *rightBar = [[UIBarButtonItem alloc] initWithTitle:@"确定" style:UIBarButtonItemStylePlain target:self action:@selector(didPressedFinish)];
self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:negativeSpacer, rightBar, nil];
//当str为nil时会奔溃
[self stringByAppendingString:str];
当str为nil时会奔溃
NSMutableAttributedString *sTitle = [[NSMutableAttributedString alloc] initWithString:str];
15.UIKBBlurredKeyView candidateList:unrecognized...
原因,当项目中引入的分类重写了UITouchBegans、move、end方法,用户在使用手写输入法时会出现闪退
解决方法:将分类中的这三个方法注释掉。
16. SIGSEGV xx 系列
原因: 对于不正确的内存处理,如当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出 SIGSEGV 由于访问了坏的内存造成程序奔溃
现象:app页面卡住不动
17. An Objective-C message was sent to a deallocated 'xxx' object (zombie) at address
ViewController respondsToSelector:message sent to deallocated instance
原因:delegate的targetvc被提前释放,导致调用代理方法时访问了僵尸对象,有可能是delegate的属性没有设为weak而是assign,或者delegate的属性是weak但是使用的时候却没有用self.delegate调用,可能直接使用了成员变量
不断更新。。。有补充的可以留言
18.Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
控制台打印
-[UIView requestWillSendCallback:]: message sent to deallocated instance 0x7d554c20
原因:通知没有移除
19.UICollectionView没有注册cell
报错:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier ZTPhotoCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
20.UIConllectionView的cellForItemAtIndexPath代理方法返回了nil
报错:对这个错误不够敏感,找了半天,浪费了可爷和妹子聊天的时间。
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the collection view's data source did not return a valid cell from -collectionView:cellForItemAtIndexPath: for index path
21.Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString appendString:]: nil argument'
22.CFPrefsSearchListSource alreadylocked_copyValueForKey:
使用NSUserDefaults时key为nil