收集各类诡异的BUG:
1.app installation failed
常见的解决:http://blog.csdn.net/lvxiangan/article/details/43282165 , 或者说修改BundleID为正确的。
但是有一种情况是,例如SDK升级更换了bundle包,这个时候有些包需要重签名或者其他原因也会有这种问题,表现出来的就是闪退(PP助手) 或者 压根运行不了就在Xcode报以上的错误(XY助手)。
2.The application could not be verified.
删除本机上原来安装的APP,因为安装前后的证书不一样。
或者修改bundleID也可以。
3."_OBJC_CLASS_$ xxxxxxxClass or Others", referenced from:
http://blog.csdn.net/azhou_hui/article/details/18312047
跟着上面这个文章大多可以解决,总结起来就是:
1.删除涉及问题的framework 及 bundle资源, 重新按规范路径导入
2.检查导入后的路径设置问题,还有other linking的设置值
还有可能是冲突(不同的framework含有同名库): 两种解决:
1.把其中一个修改名字
2.把引用设置成互补相干扰(内外层引用等)
如果xxxxxClass是涉及到系统的SDK的话,则要:
检查是否丢失其他系统的framework (相应补上):例如:点击打开链接
4.不进去if语句的诡异问题:
- (void)addIconWithImage:(UIImage *)subImage andTag:(NSInteger)tag
{
BOOL has = false;
for (id subviews in self.subviews)
{
if ( ((UIView*)subviews).tag == tag )
{
has = true;
break;
}
else
{
[((UIView*)subviews) removeFromSuperview];
break;
}
}
if (has == false)
{
UIImageView* subview = [[UIImageView alloc] initWithFrame:self.bounds];
[subview setImage:subImage];
[self addSubview:subview];
}
if (has == true)
{
NSLog(@"Already had");
}
}
5.CGRect 等 CG类无法导入,很诡异的
原来是Xcode6以后就会那样,只要导入<UIKit/UIKit.h>
即可以。
6.装箱的bug:
看看下面一段程序:
NSObject* obj1 = [[NSObject alloc] init];
NSObject* obj2 = [NSNull null];
NSObject* obj3 = [NSObject new];
NSObject* obj4;
NSArray* arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];
NSLog(@"arr1 count : %ld", [arr1 count]);
输出结果是3,很明显的,最后一个obj4是一个未初始化未分配内存的“对象”,所以即使能“骗”过编译器,
但是NSArray 的方法 arrayWithObjects 会自动的消除掉obj4这个不合格对象。
再来看看,如果这样呢?
NSObject* obj1 = [[NSObject alloc] init];
NSObject* obj2 = [NSNull null];
NSObject* obj3 = [NSObject new];
NSObject* obj4;
NSArray* arr1 = @[obj1, obj2, obj3, obj4];
NSLog(@"arr1 count : %ld", [arr1 count]);
编译一遍,能通过,但是运行一次,报错了,报的错是obj4是非法的nil类型。
这个就是为啥面对不确定的对象的时候不建议用装箱的原因了。
待续...