IOS开发中 常常遇到的警告,错误汇总,解决方法

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 filesCommand /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.old: symbol(s) not found for architecture i386clang: 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 declaratorNSString *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,真机调试的时候,出现

IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法0
这正常,但是不识别机器的。
解决方法:
把 ,
IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法1
设置为以上相对应的版本就可以了。
43,真机调试的时候,出现 ios Broken pipe
解决方法::推出xcode:断开机器(iphone,ipad,ipod)链接:重启iPhone在联接xcode,就可以了。

在用xcode4开发的时候,删除不用的文件后, 编译的时候会有missing file的警告,原因是由于SVN或git造成的。
如图:

解决方案:
1.运行终端,执行命令行进入missing file目录,然后运行svn delete nameOfMissingFile或git rm nameOfMissingFile2.删除隐藏的.svn文件。命令行运行defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder开启显示隐藏文件,然后到工程目录下删除.svn文件,然后再恢复defaults write com.apple.finder AppleShowAllFiles FALSE
killall Finder3.进入工程目录,运行下面命令删除隐藏文件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

解决警告“ld: warning: directory not found for option”

从项目中删除了某个目录、文件以后,编译出现警告信息:
ld: warning: directory not found for option“XXXXXX”
很奇怪,为什么已经从项目中删除了文件和文件夹还是报这个警告呢?

去掉警告的办法如下:

1选择工程, 编译的 (targets)
2选择 Build Settings 菜单
3查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warning的路径即OK

解决警告“ld: <wbr>warning: <wbr>directory <wbr>not <wbr>found <wbr>for <wbr>option”
解决警告“ld: <wbr>warning: <wbr>directory <wbr>not <wbr>found <wbr>for <wbr>option”

Crash原因Crash原因有共性,归纳起来有:�6�1 内存管理错误�6�1 程序逻辑错误�6�1 SDK错误 (部署版本< 编译版本)�6�1 主线程阻塞内存管理错误内存管理是iPhone开发所要掌握的最基本问题,特别是使用引用计数手动管理内存的情况。内存管理错误包括:�6�1 内存泄漏:未释放不会再使用对象。比如alloc忘记release,malloc忘记free。可用XcodeProduct菜单下的Analyze功能来解决该问题;1 引用出错:引用已经被释放的对象指针。很多“莫名其妙”的Crash都是由于窗体经历的生命周期所导致的(viewDidUnload、viewDidLoad),在iOSSimulator里模拟内存警告就可以解决该问题;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的程序代码: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行的不需要修改)。

参考: http://stackoverflow.com/questions/25398312/automatic-preferred-max-layout-width-is-not-available-on-ios-versions-prior-to-8

performSelector may cause a leak because its selector is unknown

from:http://stackoverflow.com/questions/7017281/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)**

IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法10

这样,但崩溃出现,系统会出现以下提示信息:
2013-06-23 00:45:20.479 *** -[__NSArrayM addObject:]: message sent to deallocated instance 0x7179910
可见崩溃原因是内存地址0x7179910被重复释放了。****
** 如果崩溃是发生在当前调用栈,通过上面的做法,系统就会把崩溃原因定位到具体代码中。但是,如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时就可以修改scheme,让xcode记录每个地址alloc的历史,这样我们就可以用命令把这个地址还原出来。如图:(跟设置NSZombieEnabled一样,添加MallocStackLoggingNoCompact,并且设置为YES)
IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法11

这样,当出现崩溃原因是
message sent to deallocated instance 0x7179910,我们可以使用以下命令,把内存地址还原:**
info malloc-history 0x7179910****
如图,这个命令能具体把这个地址在哪一行代码生成还原出来。
IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法12

(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)
IOS开发中 常常遇到的遇到的警告,错误汇总,解决方法13

(同样是
通过Product->Scheme->Edit Scheme进入上面编辑页面,选中Info tab
)这样,好好检查一下那一行的代码,应该就很容易找出问题所在了。


Warning: Multiple build commands for output /.../...

出现这种 Warning 的原因
由于将原来资源文件包删除,重新加入后,导致编译器在编译时,又一次引入了该资源!也就是说,编译的外部资源引入重复!

解决方法:

如何避免种情况的发生

1.删除项目文件,要从工程中删除。
2.切记,同一个资源不可重复引用到工程中。
3.添加资源,要从工程中添加。
4.最好,再删除资源后,先Clean 一下项目

推荐阅读更多精彩内容