ios 9ios开发百度地图定位中定位偏差怎样解决

酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
这里将介绍下我们日常开发一些从iOS8过度到iOS9给我们带来的一些变化,及解决方法。
language:zh-Hans(iOS8) &&& zh-Hans-CN(iOS9)
所有的进程列表都获取不到了
App Transport Security
iOS9和OS X El Capitan的一个新特性,App Transport Security 的目地是提高Apple 操作系统的安全性以及在此操作系统上运行的任何应用的安全性。ATS是苹果针对与 NSURL这一层做的封装,iOS9后ATS默认是开启的,即网络传输需要使用HTTPS。如果想在iOS9后继续使用HTTP的话,有两条路可以走:
在Info.plist中添加NSAppTransportSecurity类型Dictionary,在NSAppTransportSecurity下添加NSAllowsArbitraryLoads,Boolean 为 YES。
直接使用CFNetwork做网络请求,ASIHTTPRequest就是基于CFNetwotk做的封装,如果有需求的同学可以看看ASI里面的源码,如果某个时间段你又想要使用HTTPS的话,ASI对SSL/TSL的证书验证有点问题,证书验证还得自己封装一下才行。刚才我说道,ATS是苹果针对与NSURL这一层做的封装,所以我们使用CFNetwork或者更底层做网络请求的话是不受ATS限制的。
移除了discoveryd DNS解析服务
iPhone升级到iOS8后WiFi有时候会有问题,特别是Mac升级到OS X Yosemite后,时而电脑休眠唤醒唬就连不上WiFi,有时候还突然掉线,经常要手动去关闭WiFi在重新连接,这是因为苹果到了OS X Yosemite系统后,把之前的mDNSResponder换成了discoveryd DNS。iOS9和OS X Yosemite10.4后mDNSResponder又回来了。
mDNSResponder: 苹果以前一直使用控制DNS和Bonjour服务的一种进程。
discoveryd:OS X Yosemite后苹果新出的一种进程。
App Thinning
App Thinning是一个关于节省iOS设备存储空间的功能,它可以让iOS设备在安装、更新及运行App等场景中仅下载所需的资源,减少App的占用空间,从而节省设备的存储空间。
App Thinning主要有三个机制:
Slicing: 开发者把App安装包上传到AppStore后,Apple服务会自动对安装包切割为不同的应用变体(App variant), 当用户下载安装包时,系统会根据设备型号下载安装对应的单个应用变体。
On-Demand Resources: ORD(随需资源)是指开发者对资源添加标签上传后,系统会根据App运行的情况,动态下载并加载所需资源,而在存储空间不足时,自动删除这类资源。
Bitcode:开启Bitcode编译后,可以使得开发者上传App时只需上传Intermediate Representation(中间件),而非最终的可执行二进制文件。 在用户下载App之前,AppStore会自动编译中间件,产生设备所需的执行文件供用户下载安装。
其中,Bitcode的机制可以支持动态的进行App Slicing,而对于Apple未来进行硬件升级的措施,此机制可以保证在开发者不重新发布版本的情况下而兼容新的设备。Xcode7默认是开始了Bitcode,如果不想使用可以手动关闭Bitcode:
选择项目&&&点击Target&&&点击Build Setttings&&&搜索栏里搜bitcode&&&把Enable Bitcode对应的Yes改成No。
启用Bitcode编译机制,需要注意以下几点:
如果应用开启Bitcode,那么其集成的其他第三方库也需要是Bitcode编译的包才能真正进行Bitcode编译
开启Bitcode编译后,编译产生的.app体积会变大(中间代码,不是用户下载的包),且.dSYM文件不能用来崩溃日志的符号化(用户下载的包是Apple服务重新编译产生的,有产生新的符号文件),使用dSYM来收集Crash日志的同学得注意了。
通过Archive方式上传AppStore的包,可以在Xcode的Organizer工具中下载对应安装包的新的符号文件
iOS9后苹果为了对保障用户的地理位置的隐私对App请求后台定位有了权限设置,则需要多加一些代码。如果不适配iOS9,就不能偷偷在后台定位,如果没有后台定位的权限也是可以在后台定位的,只是会出现蓝条。
开启后台定位功能:locationManager.allowsBackgroundLocationUpdates = YES;
locationManager是CLLocationManager的对象,用来管理整个定位的。
配置info.plist,添加一个Required background modes,Array类型的,然后在Required background modes里面Item 0对应的Value设置为App registers for location updates,这样就解决了iOS9后台定位出现蓝条的问题了。
UI Testing
Xcode7中苹果引入了一种新的方式在应用中进行测试&&UI Testting,UI Testting允许我们找到UI元素与之交互,还能检查属性和状态。UI Testting已经完全集成进了Xcode7的测试报告,可以和单元测试一起执行。使用起来跟之前Xcode5出来的XCTest差不多,Xcode bots提供对此的支持,而且command line支持当UI测试失败时会立即发出通知。
可以参考Github上的Demo,步骤:
在DemoTests.m里创建一个test开头的方法
在setUp()里启动应用XCUIApplication().launch()
新建一个方法test开头的,在里面获取应用let app = XCUIApplication()
的到let app = XCUIApplication(),app.buttons[&View Detail&].tap()?。buttons是当前这个界面的所有按钮的集合,[]里面写按钮的名字,tap()就是执行这个按钮所对应的方法,可以是网络请求、界面跳转等等。
URL scheme
在iOS9中,如果使用URL scheme必须在&Info.plist&中将你要在外部调用的URL scheme列为白名单,否则不能使用。
配置info.plist,添加一个LSApplicationQueriesSchemes,Array类型的,然后在LSApplicationQueriesSchemes的Item里面添加urlscheme就行了,urlscheme是任意一个字符串,就是你自己需要使用的urlscheme,iOS9 URL scheme白名单适配就完成了。
出现大量的警告
Xcode7后运行以前的项目后出现大量的警告如:
(null): warning: /var/folders/p4/z7zy68r92hd3p5ry5g2v3k_8rlwzzr/C/org.llvm.clang.dalmo/ModuleCache/1TXZDLI9N2EMV/Foundation-3DFYNEBRQSXST.pcm: No such file or directory。
作为一个有洁癖的我反正是不能忍,出现警告的大致原因跟我上面提到的开启Bitcode,.dSYM文件不能用来符号化有关,Xcode试图去创建dSYM文件,但是你又不需要。
Build Settings &&&Build Options&&&Debug Information Format
Debug下的DWARF with dsYM File改成DWARF
Release下的还是之前默认的DWARF with dsYM File不变
参考资料:
& 相关主题:从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 里面内容就可以了。
要只是一个警告的话,真机调试可以过。具体解决方法待大神出现。
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&*
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:& 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&。
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`
解决警告“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
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是专门讨论内存管理这个话题。
程序逻辑错误
数组越界、堆栈溢出、并发操作、逻辑错误。扎实的编码基础、严谨细致的工作习惯、清晰的思路可以避免这类错误;
这个错误出现的现象是有的设备运行正常,有的会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的程序代码:
?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的情况。
常见的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=
__weak clsass=[Class alloc]
内存泄露 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行的不需要修改)。
第一种解决办法:
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\&&)
_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开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:(通过Product-&Scheme-&Edit
Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)
这样,但崩溃出现,系统会出现以下提示信息:
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 一下项目。
阅读排行榜

我要回帖

更多关于 ios开发定位功能实现 的文章

 

随机推荐