A valid provisioning profile for this executable was not found. 原因是测试手机上没有安装证书,也就是证书中没有包含新手机导致 到portal->devices选项中手动添加新手机,或者通过orginzer->devices->(your device)->add to portal选项自动添加到开发门户 生成新得证书下载并更新mac上旧证书
2015-01-05 20:49:02.720 AVPlayerDemo[4421:288213] 20:49:02.720 ERROR: 98: Error '!obj' trying to fetch default input device's sample rate
2015-01-05 20:49:02.720 AVPlayerDemo[4421:288213] 20:49:02.720 ERROR: 100: Error getting audio input device sample rate: '!obj'
2015-01-05 20:49:02.721 AVPlayerDemo[4421:288213] 20:49:02.720 WARNING: 230: The input device is 0x0; '(null)'
2015-01-05 20:49:02.721 AVPlayerDemo[4421:288213] 20:49:02.721 WARNING: 234: The output device is 0x26; 'AppleHDAEngineOutputDP:3,0,1,1:0:{D109-78CC-00005445}'
2015-01-05 20:49:02.721 AVPlayerDemo[4421:288213] 20:49:02.721 ERROR: 400: error '!obj'
2015-01-05 20:49:02.722 AVPlayerDemo[4421:288083] 20:49:02.722 ERROR: 400: error -66680
2015-01-05 20:49:02.722 AVPlayerDemo[4421:288213] 20:49:02.722 ERROR: 703: Can't make UISound Renderer
硬件问题 插个耳机就好了···
一般出现该问题是因为通过C调用了unix/linux 底层接口,所以需要调整c语言的编译选项,设置方法见下图:(根据实际情况选择相应的编译选项)
clang: error: linker command failed with exit code 1 (use -v to see invocation) 可能是您用了与SDK相同的第三方库,或是愚蠢的import .m文件 解决方法是删除引起错误的第三方法库的实现文件(.m文件)。
在Project target里“Architectures”设置为“Standard (armv7,armv7s)” ”Build Active Architecture Only”设为“NO”。
有个已经真机运行的程序崩掉了 在运行别的程序就报这个错 有时候工程改为release模式运行时 也会报这个错
打开Xcode的菜单product -> scheme -> edit scheme -> 在左侧选择Run xxx.app栏目,右侧选择Info标签,将Build Configuration的状态改为Debug
编译报错,删除~/Library/Developer/Xcode/DerivedData 里的缓存后有些错误去掉了 有些还是没去掉 而且command点击方法仍然显示symbol not found 网上有人说是导入第三方库的问题 检查了下 没看出问题···
证书问题 选择下证书就OK了
有些文件 和对象被重复添加,造成的编译问题
从一个.m文件把头文件和方法复制到另一个文件里面 忘记删除了 造成了这个错误 直接删掉那个文件就OK了
下面是别人遇到这个错误的解决方法 原因分析: Buildsetting 里面的 Build Active Architecture Only
这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,所以会报错编译不到文件,出错("OBJCCLASS$ZBarReaderViewController", referenced from:)
而设置为no时,会编译所有的版本,这样就解决编译出错的问题了。
这个是设备对应的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s
编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。 温馨提示下,release的时候要改为no,以适应不同设备
未定义的符号x86_64架构:
解决:少加了一个库文件。 .a没打包模拟器的 所以用真机试了下 OK了
参考:Xcode5.0.x的时候默认的Standard architectures只有(arm7,armv7s),到5.1之后默认就带上arm64的参数了。
目前临时的解决办法是
1.把1.选中Targets—>Build Settings—>Architectures。
把build active architectures only 改为 NO。
2. 把最下面的Valid Architectures中的arm64参数删掉就可以了
或者:
双击Architectures,选择other,删除$(ARCH_STANDARD),然后增加armv7和armv7s(写上:$(ARCHS_STANDARD_32_BIT))。
3.clean 再build。
一. 如果import用了C++的东西的,要把自己的.m文件改成.mm文件
二.尝试iOS device时链接期提示警告信息:
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _FT_Stream_Open from /Users/kres/Downloads/freetype-2.4.9/libfreetype.a(ftsystem.o). To fix this warning, don’t compile with -mdynamic-no-pic or link with -Wl,-no_pie
查了一下,所谓的PIE是指position independent executable,即地址无关exe,换句话说也就是生成的机器码中不能出现lea rax, some_symbol_name这样的绝对寻址,而只能以:lea rax, [rel some_symbol_name]这种形式出现,目的是为了提高安全性,这样OS可以以随机的地址加载exe。去掉CFLAGS中的-mdynamic-no-pic后重新编译链接armv6 armv7两个版本的free type代码,警告去除,不知是否会有副作用,继续体验…
这种警告解决的办法:targets-->build Settings-->Linking-->Don't create Position Independent Executables
设置为YES.警告自然消除。
三.Applications using Launch Screen Files and targetting iOS 7.1 and earlier need to also include a Launch Image in an Asset Catalog.
I ran into the exact same problem this morning. Here's how I fixed it.
Select your project in the project navigator. Under the General tab, you should see the section for App Icons and Launch Images. Where you see Launch Images Source, click 'Use Asset Catalog'.
You will then see Migrate launch images to an asset catalog dialogue. Click 'Migrate'.
Make sure that your Launch Images Source on the previous screen points to the right image set in your asset catalog. In your case, you would set it to 'Default'.
四.-ObjC
最近在做一个项目的时候,需要使用到一个第三方库,这个库的使用向导里面特别说明,在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志,这个标志以前没使用过,所以我就专门研究了一下它的作用。
之所以使用该标志,和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。
本来这样就可以解决问题了,不过在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。
明白了这些,我就清楚,这个第三方库中一定是定义了一些类别来扩着已有类,打开头文件,发现果然如此。
一些第三方库里对系统库的类加了 category ,
这时,就需要使用编译参数: -ObjC ,这样第三方库中对系统类作的扩展方法才能在工程中使用。
但是使用 -Objc 后,会产生两个问题:
1 、 undefined symbols
2 、 duplicate symbol
undefined symbols 说明工程中没有引入第三方库引用的库。
如果不加 -ObjC 参数,则在编译时不会出错,但运行时用到了没引用库的方法,则系统会崩溃。
这个问题好解决。只要找到缺的库,引入工程就可以了。
duplicate symbol 的问题就不好解决了,说明第三方库中的类名和工程中的类名,或其它第三方库中的类名重名了。
最常见的比如 Reachability 这个类,如果第三方库中引用了,自己的工程中也引用了,就会报 duplicate symbol 。
如果引用的第三方库没有源代码,就只能将自己工程中的重名类重命名了。
应对上面的问题,如果自己要制作一个库的话,要注意两点:
1 、避免对系统类加 category, 这样,别人用你的库时,不加 ObjC 参数也可以用你的库。
2 、如果库中用到了其它的第三方的源代码,尤其是用的比较普遍的,如 Reachability, 一定一定要对
这些类重命名,最常见的作法就是给类名加个前缀。以避免别人用你的库时,产生 duplicate symbol 的问题。
五.关于问题ld:library not found for -lXXX 和ld:warning:directory not found option 以及duplicate symbol的解决办法
ld:library not found for -lXXX 的问题有可能是你的某个库的连接引用有问题,解决的办法就是在项目的target里,选中Link Binary With Libraries 里的.a或framework 取消再加入,就可以了
六.No known instance method for selector 'respondsToSelector:'
协议里找不到这个方法
这个是没有继承基协议造成的 继承下
七.今天放在button上的图片 放什么都变成蓝色 郁闷了一个小时才发现
buttonWithType:UIButtonTypeCustom 写成了buttonWithType:UIButtonTypeSystem
WTF!
在button中犯的错 还有一个就是 我重写了一个button类 替换的 时候 没有替换alloc里面的UIButton
八.xcode中 有时候会报一个警告:
[WARN]Warning: Multiple build commands for output file /xxx
要解决这个问题很简单:
1.选择你的工程
2.选择target
3.点击 Build Phases
4.展开Copy Bundle Resources
5.删除里面的刚才提示警告的文件,一般为红色的名字的文件
九.关于屏幕旋转
我每次转动屏幕的时候 就老是电池条跑啊跑的 把这个删了 整个世界就清净了
按我的理解 这个东西 用SB写界面的可以留着 用代码写的就删了吧
十.Duplicate declaration of method 'XXXXXXX:'
duplicate ['dju:plikət, 'dju:plikeit]n. 副本;复制品
declaration [deklə'reɪʃ(ə)n]n. (纳税品等的)申报;宣布;公告;申诉书
方法重复申明了
后来找朋友问了下 发现 我用的实例没初始化 WTF!!!
于是余有叹焉 查bug 先打断点看内存
二、在一个视图里面用bringSubviewToFront 没效果
应该在同一个父视图添加完其它视图后 调用[self.view bringSubviewToFront:pickview];
implicit [ɪm'plɪsɪt]adj. 含蓄的;暗示的;盲从的 隐式( Implicit ) :对于给定变量,单元内的未知值用邻近单元的已知和未知值计算得出。
conversion [kən'və:ʃən]n. 转换;变换;[金融] 兑换;改变信仰
loses ['lu:zɪz]损失 integer ['ɪntɪdʒə]n. [数] 整数;整体;完整的事物
precision [pri'siʒən] n. 精度,[数] 精密度;精确
aka ['ækə]. 又叫做,亦称(also known as)
隐式转换损失精度整数:“NSUInteger”(又名“无符号长”)“int”
可以在前面添加个括号 强转下 (int) 也可以转成 nsnumer intvalue
由于捕获到异常RLMException 导致索引越界
terminate ['tɜːmɪneɪt]vt. 使终止;使结束;解雇 vi. 结束,终止;结果 adj. 结束的
terminating [/'tə:mineitiŋ]n. [电] 终接 v. 结束;使终结;解雇(terminate的现在分词)
due to 由于因为 uncaught 捕获 exceptionn. 例外;异议
*** First throw call stack:
libc++abi.dylib: terminating with uncaught exception of type NSException
本来是通过下面这个方法隐藏的电池条
- (BOOL)prefersStatusBarHidden{
return YES;
}
后来改动了 plist里面的 View controller-based status bar appearance项
设为了YES, 结果我上面那个方法就不走了
在代码里添加了[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO]; 就ok了
补两个tips
取info.plist中 View controller-based status bar appearance中的设置:
NSNumber *isVCBasedStatusBarAppearanceNum = [[NSBundle mainBundle]objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
if (isVCBasedStatusBarAppearanceNum){
_isVCBasedStatusBarAppearance = isVCBasedStatusBarAppearanceNum.boolValue;
} else {
_isVCBasedStatusBarAppearance = YES; // default
}
在view controller中调用setNeedsStatusBarAppearanceUpdate,更新status bar的显示。
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
如果要更改Info.plist与Prefix.pch文件实际路径,也就是实际文件的位置(不是在工程中的组织路径),需要到Build Settings中修改对应的配置,不然工程就找不到对应的Info.plist与Prefix.pch文件。
报错情况:
1、Info.plist文件路径错误
error: could not read data from '/Users/sf_gxd/Desktop/Gasake/Gasake/Gasake-Info.plist': The file “Gasake-Info.plist” couldn’t be opened because there is no such file.
2、prefix.pch文件路径错误
clang: error: no such file or directory: '/Users/sf_gxd/Desktop/Gasake/Gasake/Gasake-Prefix.pch'
clang: error: no input files
如果还是报错就是没修改test里面的地址
Prefix.pch的路径尽量用相对路径$(SRCROOT) 不然路径一有改动就要跑回去改
(系统不生成了 尽量不用的好)用的话 在other里面新建 然后到build Setting里面 搜Prefix 是 Prefix 而不是pch因为这个时候里面有没有 pch文件的 然后把地址拖进去就可以了
button的监听事件添加习惯了 直接@selector了 在这个地方应该是 把action 放进去
不同情况不同对待 习惯亦可误人
[camerabtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[camerabtn setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];
左边那个是选中状态 后面那个蓝色背景 是7以后的tintcolor造成的
所以在上述代码后还要再添加一句[camerabtn setTintColor:[UIColor clearColor]];
去除tint颜色
今天搞的button无法点击 最后发现是是由于位置偏离了父视图的原因,搜狗输入法又作死了
在打印信息中看到值为null 于是用了isEqual:[NSNull null]
没效果.
猜测可能是字符串null? 于是用了isEqualToString:@"null"
然而还是没有卵用 于是断点看了下是nil nickName == nil
OK了,但最后觉得其实nickName.length == 0
更好点,因为不管是null还是nil,length总归 都是等于0的。
本来在方法中定义的一个char数组 结果没跑多久就内存暴涨挂掉了char rgbaBuf[Width_Video*Height_Video\*4];
后面把这个搞成全局的就OK了
把version 改为1.0.0 然后重写archive submit就好了
unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow:
解决:self.window = [[UIWindow alloc]init];
改为self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
是因为window没有frame
才知道类名首字母大写不仅仅是规范···
整整一个下午排除这个bug 之前监听和写入的失败 就是因为 我想当然的以为在didConnectPeripheral的时候self.peripheral = peripheral;已经拿到了全部的特征和服务 其实 是一直才查询完服务和特征的代理走完 才拿到全部的服务和特征值
父类强转子类 需要使用子类来初始化 否则无法强转
子类可以强转父类
删除target 和 tests的Framework Search Paths的目录 把库文件删除引用重新添加
解决:选择工程->Build Settings -> Code Signing -> Code Signing Identity -> Debug -> Any ios SDK 将选项改为:iOS Developer
解决:在Build Settings里面搜索Bitcode 将Enable Bitcode设置为 NO 就可以了
应用安全传输已经阻止了明文HTTP(http://)
资源加载,因为它是不安全的。暂时异常可以通过配置应用的plist文件解决。
使用高德地图遇到的
到plist里面添加NSAppTransportSecurity 字典 下面添加NSAllowsArbitraryLoads 布尔值 YES
以前添加plist习惯在列表选了 找了半天没找到才发现是可以添加的 后来发现其实直接用文本打开写入也是可以的
复制下面这段进去
<key>NSAppTransportSecuritykey>
<dict>
<key>NSAllowsArbitraryLoadskey>
<true/>
dict>
网友说可能是子线程问题 可是我并没开子线程 但修改后发现真的是子线程问题-(void)refresh{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
// [self.tableView reloadData];
}
这个reload方法是通知调用刷新的
本地声明隐藏了实例变量
reason: '*** Collection <__NSArrayM: 0x14e5a060> was mutated while being enumerated.'
证实了下 遍历数组的时候 你是不能修改数组的
随便拿了一台 没加到测试机里面的机子 测试的时候
然后fix issue OK 可以往手机上跑了
但是当打包的时候 就开始报错了 这是时候 找到codesign 双击provision文件就OK了
注:当在手机跑完 直接双击provision 文件 并没有用 打包的时候还是会报错
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x17d8a640> was mutated while being enumerated.
枚举的时候 调用了一个方法 里面有遍历了数组
在后面方法中把数组 mutable copy 一份就解决了*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x15e5de60'
测试了下copy 果然是不行的 必须是深拷贝
使用的AMap.bundle是for 2D的,去官网的相关下载中下载3D地图的DEMO,替换掉原来的就解决了。
原文地址:http://www.jianshu.com/users/0d278258ab78/latest_articles