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

从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,missingrequiredarchitecturei386infile
解决办法:如果是错误信息的话:
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 theargument 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]);

37118: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造成的。

如图:

Xcode4删除文件后missing<wbr>file警告

<wbr></wbr>

解决方案:


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 { } \;

<wbr></wbr>

使用Xcode 4时, 文件已经删除,但是会出现missing file错误,这一般是SVN或git造成的,有几种方法可以删除:
删除一个文件:

1.命令行进入missing file目录,然后运行

svn<wbr></wbr>delete文件名<wbr></wbr>或<wbr>git<wbr>rm</wbr></wbr>文件名<wbr></wbr>

批量删除的一个方法,删除.svn文件:
在终端中输入cd (有空格),将项目文件夹拖进入,回车
输入命令行:
rm -rf `find . -type d -name .svn`
再回车

引用:http://blog.sina.com.cn/s/blog_63e26d560100ve00.html

<wbr><wbr><wbr><wbr><wbr><a target="_blank" href="http://blog.csdn.net/mars2639/article/details/7374532" style="text-decoration:none; color:rgb(65,100,111)">http://blog.csdn.net/mars2639/article/details/7374532</a></wbr></wbr></wbr></wbr></wbr>


解决警告“ld:warning:directorynotfoundforoption”

(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

解决警告“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”

解决警告“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功能来解决该问题;

�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<wbr>的属性,而自动的特性只支持iOS8,故导致这个警告,如果想兼容iOS7则需要消除。</wbr>

解决方法:设置固定的 preferredMaxLayoutWidth<wbr>(勾选Explicit(其中如果label不是多行就不用勾选了,因为无效)如果只想支持iOS8就不要勾选了,动态的更加方便),如下图,并在代码中实时修改此属性(注:此属性只对多行的UILabel有效,即lines不为1,如果是1行的不需要修改)。</wbr>

Automatic<wbr>Preferred<wbr>Max<wbr>Layout<wbr>Width<wbr>is<wbr>not<wbr>available<wbr>on




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 的原因

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


解决方法:


Warning:<wbr>Multiple<wbr>build<wbr>commands<wbr>for<wbr>output<wbr>file

<wbr></wbr>


如何避免种情况的发生


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-history0x7179910

如图,这个命令能具体把这个地址在哪一行代码生成还原出来。

(需要注意的是,因为这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且有点遗憾的是,只支持模拟器,不支持真机调试)

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





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


出现这种 Warning 的原因

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


解决方法:


Warning:<wbr>Multiple<wbr>build<wbr>commands<wbr>for<wbr>output<wbr>file

<wbr></wbr>


如何避免种情况的发生


1.删除项目文件,要从工程中删除。

2.切记,同一个资源不可重复引用到工程中。

3.添加资源,要从工程中添加。

4.最好,再删除资源后,先Clean 一下项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值