从sdk3.2.5升级到sdk 5.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了。
1,警告:“xoxoxoxo” is deprecated
解决办法:查看xoxoxoxo的这个方法的文档,替换掉这个方法即可。
2,警告:Declaration of “struct sockaddr” will not be visible outside of this function
解决办法:在你的开源.m文件中添加 #import <netinet/in.h>
3,警告:Implicit conversion from enumeration type ‘UIInterfaceOrientation’ to different enumeration type ‘UIDeviceOrientation’
解决办法:类型不匹配。跳到出错的那一行,UIInterfaceOrientation强制转换为UIDeviceOrientation就行了。
4,警告:incompatible pointer types assigning to ‘MyArrayList*’from ‘NSMutableArray’
解决办法:加入强制转换(MyArrayList*)
5,警告:‘&&’ within ‘||’
问题出处:
if (exists && !isDirectory || !exists)………
解决办法: if ((exists && !isDirectory) || !exists)………
6,警告:Warning:The Copy Bundle Resources build phase contains this target’s Info.plist file
解决办法:将Info.plist文件移到Resources目录下,而不要直接放在target下。
7,警告:在使用ASIHttp…第三方库的,运行报错。
解决办法:看你的项目中是否添加CFNetwork.framework、SystemConfiguration.framework, MobileCoreServices.framework,
CoreGraphics.framework和libz.1.2.3.dylib,如果是sdk5.0以上,改添加libz.1.2.5.dylib
8,警告:xxxooo,missing required architecture i386 in file
解决办法:如果是错误信息的话:Target->Build Settings->Search Paths, 删除FrameworkSearch Paths 里面内容就可以了。
要只是一个警告的话,真机调试可以过。具体解决方法待大神出现。
9,警告:
clang: error: no such file or directory: ‘/demo2/控件代码/13/Recorder/Recorder_Prefix.pch’
clang: error: no input files
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1
解决办法: 在你的主工程文件 target搜素,pch ,找到Prefix Header 把它后面的值,都删除,再运行就解决了。
10,警告:
“ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute
解决办法:如果定义了ARC有效,那么必须要有所有者属性的定义;所以代码改成下面这样
@property (nonatomic, strong, readonly) NSString *ss;
11,警告:
io6一下的xib系统均没有自动选择Use Autolayout, Supporting iOS 5 and below with xib of iOS 6
解 决办法:Just un-select “Use Autolayout” in the file inspector of the xib’s view and we are back to the familiar autosizing in size inspector and boom, it supports iOS 5 and below.
12,警告:
Warning: Multiple build commands for output file xxx.png
解决办法:找到项目里xxx.png重复,删除重复的资源。
11, 错误信息:
“_OBJC_CLASS_$ xxxxx “, referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法:
查看工程,看是不是没有导入相关的框架。或者工程里添加的有相同”.m”,”.h” 文件
12, 错误信息:
Couldn’t register dy.CKRiLiText with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.Current language: auto; currently objective-c
解决方法: 可能是电脑内存问题引起,重启电脑即可解决。如果重启解决不了问题,那就是你刚刚改动的代码引起的问题。
13 、 错误信息:
ios 5是调试正常的,ios 6真机调试的时候,出现如下错误:ld: file is universal (3 slices) but does
not contain a(n) armv7s slice: /Users/mac4/Desktop/my desktop/My app/MyApp name 20:09:12 /MyApp name/ZBarSDK/libzbar.a for architecture armv7serror:
linker command failed with exit code 1 (use -v to see invocation)
解决方法:在Xcode里,点击相应的Target,然后点Build Settings,找到VALID_ARCHS,看里面的是不是arvm7s,如果不是改成arvm7s就可以了。
14 、 错误信息:
error: receiver type ‘ViewController’ for instance message does not declare a method with selector ‘hideSearchBar:’ [4]
ViewController 中没有声明一个方法选择’hideSearchBar:
解决方法:
在ViewController .h 中声明一下这个方法 “ hideSearchBar ” 即可。
15、 错误信息:当json从服务端请求时得到的字符串,如果这样写的话,会报错,‘;’ after top level declarator
NSString *ss= @”{“recommend”:”世界末日”,”dogname“:”机器人”}”;
解决方法:
就是,把 “ 替换成 \” 即可。NSString *ss= @”{ \”recommend \”:\”世界末日 \”, \”dogname \”: \”机器人 \”}”;
31,警告:
warning: Semantic Issue: Incompatible integer to pointer conversion assigning to ‘BOOL *’ (aka ‘signed char *’) from ‘BOOL’ (aka ‘signed char’)
解决办法: 检查 BOOL *换为BOOL就可以了,多写一个 * 号。
Xcode升级到4.4后,出现了一堆的Warning.网上搜了一些办法,总结一下。
32:Jsonkit中的
Direct access to objective-c’s isa is deprecated in favor of object_setClass() and object_getClass()
object->isa 替换为 object_getClass(object)
keyObject->isa 替换为 object_getClass(keyObject)
(id)keys[idx]->isa 替换为 object_getClass((id)keys[idx])
format specifies type ‘unsigned long’ but the argument has type ‘nsuinteger’ (aka ‘unsigned int’)
给变量增加(unsigned long)进行类型转换
33:md5加密(iOS SDK中自带了CommonCrypto
Implicit declaration of function ‘CC_MD5′ is invalid in C99
view plaincopy
#define CC_MD5_DIGEST_LENGTH 16
+(NSString *)MD5HashForString:(NSString *)input {
const char *cStr = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
return [NSString stringWithFormat: @”%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x”,
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]];
}
引入函数定义的头文件
#import <CommonCrypto/CommonDigest.h>
34:ASIDataDecompressor中的警告
format specifies type ‘short’ but the argument has type ‘int’
在+ (NSError *)deflateErrorWithCode:(int)code 和 +(NSError *)inflateErrorWithCode:(int)code中
[NSString stringWithFormat:@”Compression of data failed with code %hi”,code] 中
将code改为 (short)code,类型转换
35:Reachability中警告
Using ‘stringWithString:’ with a literal is redundant
statusString = [NSString stringWithString: @”Not Reachable”];
改为:statusString = @”Not Reachable”;
36.format specifies type ‘id’ but the argument has type ‘const char *’
NSCAssert(NO, @”Unhandled error encountered during SAX parse. msg is %@”, msg);
改为:NSCAssert(NO, @”Unhandled error encountered during SAX parse. msg is %@”, [NSString stringWithUTF8String:msg]);
37 118:65: Using ‘stringWithString:’ with a literal is redundant
改为:self.locationInput.text = @”captured change”;
38 在项目中设置控件的layer属性时,会发生错误,”Property ‘c’ cannot be found in forward class object ‘CALayer *”,
这时需要引入 #import <QuartzCore/CALayer.h>。
41,错误
Error launching remote program: failed to get the task for process
解决方法:
把真机上的软件,删除,然后,clean 一下,重新运行就可以了。
42,真机调试的时候,出现
这正常,但是不识别机器的。
解决方法:
把 ,
设置为以上相对应的版本就可以了。
43,真机调试的时候,出现 ios Broken pipe
解决方法:
:推出xcode
:断开机器(iphone,ipad,ipod)链接
:重启iPhone在联接xcode,就可以了。
在用xcode4开发的时候,删除不用的文件后, 编译的时候会有missing file的警告,原因是由于SVN或git造成的。
如图:
解决方案:
1.运行终端,执行命令行进入missing file目录,然后运行
svn delete nameOfMissingFile
或
git rm nameOfMissingFile
2.删除隐藏的.svn文件。
命令行运行
defaults write com.apple.finder AppleShowAllFiles TRUE?
killall Finder
开启显示隐藏文件,然后到工程目录下删除.svn文件,然后再恢复
defaults write com.apple.finder AppleShowAllFiles FALSE
?killall Finder
3.进入工程目录,运行下面命令删除隐藏文件
find . -name .svn -exec rm -rf { } \;
使用Xcode 4时, 文件已经删除,但是会出现missing file错误,这一般是SVN或git造成的,有几种方法可以删除:
删除一个文件:
1.命令行进入missing file目录,然后运行
svn delete 文件名 或 git rm 文件名
批量删除的一个方法,删除.svn文件:
在终端中输入cd (有空格),将项目文件夹拖进入,回车
输入命令行:
rm -rf `find . -type d -name .svn`
再回车
引用:http://blog.sina.com.cn/s/blog_63e26d560100ve00.html
http://blog.csdn.net/mars2639/article/details/7374532
解决警告“ld: warning: directory not found for option”
(2013-06-02
03:01:56)
标签:
it |
分类: iOS开发 |
从项目中删除了某个目录、文件以后,编译出现警告信息:
ld: warning: directory not found for option“XXXXXX”
很奇怪,为什么已经从项目中删除了文件和文件夹还是报这个警告呢?
去掉警告的办法如下:
1选择工程, 编译的 (targets)
2选择 Build Settings 菜单
3查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warning的路径即OK
Crash原因 Crash原因有共性,归纳起来有: ?6?1 内存管理错误 ?6?1 程序逻辑错误 ?6?1 SDK错误 (部署版本< 编译版本) ?6?1 主线程阻塞 内存管理错误 内存管理是iPhone开发所要掌握的最基本问题,特别是使用引用计数手动管理内存的情况。内存管理错误包括: ?6?1 内存泄漏:未释放不会再使用对象。比如alloc忘记release,malloc忘记free。可用XcodeProduct菜单下的Analyze功能来解决该问题; ?6?1 引用出错:引用已经被释放的对象指针。很多“莫名其妙”的Crash都是由于窗体经历的生命周期所导致的(viewDidUnload、viewDidLoad),在iOSSimulator里模拟内存警告就可以解决该问题; ?6?1 内存警告:App使用的内存超出设备的限制,iOS将强制挂起App,强制挂起iOS是不会记录Crashlog,Flurry也无法记录。内存泄漏、快速/大量的分配内存都可能导致内存警告,这时候应该尽可能的释放不需要的资源。通过Instruments->Allocations里的Heapshot功能能够找出哪些资源未被释放。 WWDC 2012的Session242 - iOS App Performance_ Memory是专门讨论内存管理这个话题。 程序逻辑错误 数组越界、堆栈溢出、并发操作、逻辑错误。扎实的编码基础、严谨细致的工作习惯、清晰的思路可以避免这类错误; SDK错误 这个错误出现的现象是有的设备运行正常,有的会Crash。原因是未找到框架、类、方法、属性。比如:用iOS5.0 SDK编译并运行在iOS4.0的设备上,5.0的Twitter框架在4.0的设备上找不到。这种问题常出现在用苹果新发布的Xcode编译原有的工程。 未找到框架的解决办法是:部署版本>= 编译版本。iOS框架向后兼容做的很棒,部署版本> 编译版本一般不会出现问题。 未找到类、方法、属性的解决办法是:先判断是否存在再使用 if(NSClassFromString(@"MFMailComposeViewController")) respondsToSelector: 主线程阻塞 主线程阻塞超过10s,iOS将强制挂起App。把长时间的任务放到后台线程去执行,可使用NSThread,NSOperation, dispatch。WWDC2012的Session235 - iOS App Performance_ Responsiveness有详细的介绍。 解决Crash 思路是:定位Crash的程序代码,预测Crash原因,寻找解决方案,测试。 有多种方式可以定位Crash的程序代码: ?6?1 Debug模式时,iOSSimulator断点测试定位Crash的堆栈; ?6?1 真机连接iTunes查看Crashlog (Debug模式下); ?6?1 通过Flurry的错误记录查看; 定位之后,就是重新思考程序上下文逻辑,并有理由的预测Crash出现的原因。预测的越多,理解的越深。 寻找解决方案的方法有: ?6?1 浏览苹果官方SDK文档,找出错误原因; ?6?1 Google搜索Crash输出的信息,重点查找行业内技术论坛:cocoachina、stackoverflow、iphonedevsdk等; ?6?1 查看历届WWDC的视频、示例代码; ?6?1 在工程里添加环境变量: NSZombieEnabled、NSDebugEnabled,输出有价值的信息; ?6?1 如果未找到任何信息,可以寻求苹果官方论坛、业内技术论坛的帮助; 测试 找到解决方案后就需要测试,测试功能输入输出的准确性、程序性能、是否引入新的bug。测试有专业的测试工程师来负责,但开发工程师不能依赖测试工程师来发现问题,尽量独立解决已知存在的问题。 由于Xcode部署工程到真机上比较耗时间,如果可以的话尽可能用iOSSimulator来测试,以减少测试的时间。 建议开发工程师有一个checklist,在产品测试时自己逐一过一下上面常见的问题,这个能够避免大部分Crash。下图是我们一个产品的FlurryError记录,那120个错误Session是测试Crash时留下的。当然这个记录是没有包括iOS将强制挂起App的情况。
1.
常见的EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION错误,一般是因为访问已经被release的对象造成的。
最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间
在工程中加入NSZombieEnabled 环境变量,并设为启用,则在 EXC_BAD_ACCESS 发生时,XCode 的 Console 会打印出问题描述中,设置方法:双击Executables 下的 可执行模组,在弹出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,并设定为 YES,点击选中复选框启用此变量。
可以再加入 MallocStackLogging 来启用malloc记录,以获得更多的提示来帮助定位问题。
一般服务端返回的字符串为nil 如果不加判断
NSArray ,mutableArray 等没有申请内存,直接用
block 直接用有时会造成这样的bug block可能为空
遇到这种问题,看代码,看实现的逻辑,打断点,return ,po ,bt 指令,网上查资料,
2.内存问题,循环引用,代理用strong
代理要assign ,或者weak ,
block 也可能导致循环引用 __block __weak blockSelf=self;
__weak clsass=[Class alloc]init;
内存泄露 delloc 把代理设为空
3.removeFromSuperView ,然后复位空
在做适配的又xib 添加约束,要自己添加UITableView的时候,要把元来的移除掉
4.UITableView卡顿的问题
复用之前还要把cell之前的数据清空
关于常见场景:大IO、复杂算法、大量创建对象、大量添加View等等都有可能消耗性能。不过常见的case一般都是IO,比如楼主说的下载图片。
除了使用异步下载之外,还需要注意异步下载的状态,因为建立连接也是需要消耗资源的,虽非当前线程资源,但整个设备的资源依然是有限的,如果你同时建立上百个异步下载连接(例如用户滑动经过了上百条Cell),系统也会卡顿,这也是需要注意的
5.做IOS适配的时候
4s 首次安装的时候数据无法显示,WIFI 连接问题,非必现
6.闪退,url,不存在,方法不当都有导致闪退
7.数据 后台更新前台无法接受,有可能是后台的问题
8,需求变更,需求不确定,后台数据,
在Xcode6下开发时,使用autolayout的xib出现警告:Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
原因:xcode6下默认开启自动设置UILabel的preferredMaxLayoutWidth 的属性,而自动的特性只支持iOS8,故导致这个警告,如果想兼容iOS7则需要消除。
解决方法:设置固定的preferredMaxLayoutWidth (勾选Explicit(其中如果label不是多行就不用勾选了,因为无效)如果只想支持iOS8就不要勾选了,动态的更加方便),如下图,并在代码中实时修改此属性(注:此属性只对多行的UILabel有效,即lines不为1,如果是1行的不需要修改)。
performSelector may cause a leak because its selector is unknown
第一种解决办法:
As a workaround until the compiler allows overriding the warning, you can use the runtime
objc_msgSend(_controller, NSSelectorFromString(@"someMethod"));
instead of
[_controller performSelector:NSSelectorFromString(@"someMethod")];
You‘ll have to
#import <objc/message.h>
第二种:
To ignore the error only in the file with the perform selector, add a #pragma as follows:
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
第三种:
#define SUPPRESS_PERFORM_SELECTOR_LEAK_WARNING(code) _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") code; _Pragma("clang diagnostic pop")
SUPPRESS_PERFORM_SELECTOR_LEAK_WARNING(
return [_target performSelector:_action withObject:self]
);
Warning: Multiple build commands for output /.../...
出现这种 Warning 的原因
由于将原来资源文件包删除,重新加入后,导致编译器在编译时,又一次引入了该资源!也就是说,编译的外部资源引入重复!
解决方法:
如何避免种情况的发生
1.删除项目文件,要从工程中删除。
2.切记,同一个资源不可重复引用到工程中。
3.添加资源,要从工程中添加。
4.最好,再删除资源后,先Clean 一下项目。
iOS内存错误EXC_BAD_ACCESS的解决方法(message sent to deallocated instance)
转:点击打开链接
iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:(通过Product->Scheme->Edit
Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
这样,但崩溃出现,系统会出现以下提示信息:
2013-06-23 00:45:20.479 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x7179910
可见崩溃原因是内存地址0x7179910被重复释放了。
如果崩溃是发生在当前调用栈,通过上面的做法,系统就会把崩溃原因定位到具体代码中。但是,如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时就可以修改scheme,让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来。如图:(跟设置NSZombieEnabled一样,添加MallocStackLoggingNoCompact,并且设置为YES)
这样,当出现崩溃原因是message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:
info malloc-history 0x7179910
如图,这个命令能具体把这个地址在哪一行代码生成还原出来。
(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)
(同样是通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab)这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。
Warning: Multiple build commands for output /.../...
出现这种 Warning 的原因
由于将原来资源文件包删除,重新加入后,导致编译器在编译时,又一次引入了该资源!也就是说,编译的外部资源引入重复!
解决方法:
如何避免种情况的发生
1.删除项目文件,要从工程中删除。
2.切记,同一个资源不可重复引用到工程中。
3.添加资源,要从工程中添加。
4.最好,再删除资源后,先Clean 一下项目。