【IOS】IOS开发问题解决方法索引(四)
1 IOSNSTimer线程无法在委托方法之外停止
NSTimer无法在线程的委托方法之外停止。
2 在IOS4.3中添加AdSupport.framework会引起dyld ‘dyld_fatal_error
将库引用参数设置为可选即可解决。
3 Failed to get the task for process xxx
证书问题,project与target的调试证书都必须是开发者证书,ADHOC的证书会出现此问题。
4 IOS NSInvocation使用
NSInvocation的使用
http://www.cnblogs.com/pengyingh/articles/2359199.html
iOS 通知中心NSNotificationCenter & NSNotification
http://blog.csdn.net/crayondeng/article/details/9372079
5 UIPopoverController使用
UIPopoverController的使用
http://www.cnblogs.com/wengzilin/archive/2012/03/13/2393675.html
UIPopoverController的使用心得
http://blog.csdn.net/smking/article/details/7683363
6 Xcode条件编译
条件编译不是多高深的技术,却很实用,可以帮助我们针对不同的target编译出不同的版本。比如,希望同一份代码编译出完全版和功能受限的免费版,以减小维护成本。
首先要在某个project或者target上get info。在Build页中,找到GCC 4.2 - Preprocessing下面的Preprocessor Macros,双击,在弹出来的对话框中增加一个值,例如FREE_VERSION。确定。
然后在代码中加入如下语句:
#if!defined(FREE_VERSION)
...//do for fullversion
#else
...//do for freeversion
#end
7 Xcode利用宏区分模拟器与真机
Xcode 利用宏定义区分iphone模拟器和真机
http://blog.csdn.net/zypsg/article/details/5524623
#if TARGET_IPHONE_SIMULATOR
label . text = @"iphoneSimulator" ;
#elif TARGET_OS_IPHONE
label . text = @"iphoneDevice" ;
#endif
8 IOS设备类型判断
iOS 判断设备类型
http://blog.sina.com.cn/s/blog_9c3c519b01013gdx.html
如何判断 ios设备的类型(iphone,ipod,ipad)
http://blog.csdn.net/tangaowen/article/details/6525992
9 IOS中多版本,多设备类型支持注意事项
IOS中多版本,多设备类型支持注意事项
http://www.cnblogs.com/smileEvday/archive/2013/04/10/SDKCompatility.html
10 ”A valid provisioning profilefor this executable was not found“ 问题
”A valid provisioning profile for this executable was not found“ 问题google一下有很多答案,我在这里总结一下我的经验。从描述上可以看到说:对于可执行provisioning profile 没有被找到。所以网上有很多答案是说你provisioning profile没有被找到,需要重新导入之类的。
但是我碰到的原因是我在Project中将Code Signing Identity中将其设置成了iPhone Develop,但是在Target中的Code Signing Identity并没有自动切换过来,我发现在Target中的Code Signing Identity还是我之前的设的iPhone Distribution,
所以看到这里就知道了,iPhone Distribution 的provisioning profile肯定是不能运行的,所以把Target中的Code Signing Identity也设置成iPhone Develop就ok了,这样一切都说的通了,唯一不合理的就是在Project切换Code Signing Identity并编译,但xCode没有自动将编译后的Target设置成和Project中的一致。
11 IOS使用模态框弹出子视图后,子视图大小设置
IOS SDK内建支持模态窗口式弹出方式(利用presentModalViewController方法),原理是将子视图包含在一个模态视图中,但是不足之处在于此模态视图大小是固定的,为540*620,若子视图大小小于这个,周围就会出现灰色边缘。
要解决此问题,在执行完presentModalViewController方法之后,再次手动设置模态窗口大小:subVC.view.superView.frame
12 UIImageView加圆角
圖片要加圓角的做法在 iphone 3.0 變得很容易
imageThumbnail.image=[UIImageimageWithContentsOfFile:strPath];
imageThumbnail.layer.masksToBounds=YES;
imageThumbnail.layer.cornerRadius=10.0;
imageThumbnail.layer.borderWidth=1.0; //边框阴影宽度
imageThumbnail.layer.borderColor=[[UIColorgrayColor] CGColor];
透過以上的程式碼就可以達到目的, 真是方便很多Orz. 請記得要import <QuartzCore/QuartzCore.h>
13 dequeueResuableCellWithIdentifier原理
dequeueReusableCellWithIdentifier原理
http://ronglei0324.blog.163.com/blog/static/67633223201312631558212/
14 autolayout on ios Versions prior to 6.0
Auto Layout on iOS Versions prior to 6.0
http://blog.csdn.net/topbar/article/details/12345511
15 Xcode模拟器simulators7,6,5下载地址及安装
1.下载链接
1 2 3 4 5 6 7 8 9 10 |
iOS7.0模拟器: http://devimages.apple.com/downloads/xcode/simulators/ios_7_0_simulator.dmg iOS6.1模拟器: http://devimages.apple.com/downloads/xcode/simulators/ios_6_1_simulator.dmg iOS6.0模拟器: http://devimages.apple.com/downloads/xcode/simulators/iphone_6_0_iphonesimulatorsdk6_0.dmg iOS5.1模拟器: http://devimages.apple.com/downloads/xcode/simulators/iphone_5.1_iphonesimulatorsdk5_1.dmg iOS5.0模拟器: http://devimages.apple.com/downloads/xcode/simulators/ios_50_simulator-1.dmg
iOS 7 doc set http://devimages.apple.com/docsets/20130918/091-9917-A.dmg xcode 5 doc set http://devimages.apple.com/docsets/20130918/091-9915-A.dmg |
2. iOS模拟器的安装
2.1常规安装
Xcode默认支持的iOS模拟器的在线安装,启动Xcode5.1后打开菜单Xcode->Preferences...再点击Downloads就可以看到Xcode默认支持的iOS各版本模拟器,如果还没有安装,只需要点击后面的下载箭头标识,Xcode就会自动下载和安装相应的组件,因为需要下载和安装,可能需要等待较长时间才能完成下载和安装。
另外,下载的临时文件存放在/Users/<username>/Library/Caches/com.apple.dt.Xcode/Downloads目录中。
2.2第三方下载器下载后安装
但是往往用xcode自动下载模拟器会非常慢或者经过很长一段时间后提示Failed to mount file
什么的
这时候就可以找到下载链接用下载器进行下载,进入目录
/Users/<username>/Library/Caches/com.apple.dt.Xcode/Downloads 将5dba03a4b33ac2c0d7a72e94475011c25eb06a73.dvtdownloadableindex 类似文件重命名成.plist后缀文件(com.apple.dt.Xcode 要右键显示包内容进入,不要双击打开)
找到downloadables,某个item中寻找
dmg source下载地址
可以找到simulator dmg明显字样的链接下载即可(文章开头的链接就是取自plist文件)
2.3下载后的dmg安装.这里主要以iOS7.0模拟器的离线安装为例进行说明,其他版本以此类推:
下载ios_7_0_simulator.dmg后打开dmg文件,可以看到安装包iPhoneSimulatorSDK7_0.pkg,使用安装器安装此安装包,默认会安装在所选分区的/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk目录下,完全退出Xcode后将刚才安装的iPhoneSimulator7.0.sdk整个目录复制或移动到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs目录下即可,(Xcode.app右键可以"显示包内容“)重新启动Xcode一般就可以使用相应版本的模拟器进行开发和调试了。
离线安装还有一个简单的办法就是将以前安装过的旧版本的Xcode如Xcode5.0.2下面已经安装好了的iOS模拟器直接复制过来使用,目录位置都一样,都是在Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs里面。这样就不用再下载离线安装包了。
16 iOS:忘记密码或输入错误密码后设备停用
当您在设置密码确保安全使用iPhone、iPad 或 iPod touch 后输入了错误的密码,可能会看到设备“已停用”的消息。了解如果您已忘记或不记得自己的密码或者设备显示“已停用”的消息时应如何处理。
如果您输入错误密码六次或以上,将看到以下任一消息:
§ iPhone 已停用
§ iPad 已停用
§ iPod touch 已停用
如果您之前将设备与 iTunes 同步过,您或许能够通过恢复设备来重设密码:
1. 将设备连接到通常与之同步的电脑,然后打开 iTunes。
注:如果 iTunes
提示您输入密码,请尝试已经与其同步的另一台电脑。否则,请前往下文“如果您从未将设备与 iTunes
同步,或没有权限访问电脑”部分。
2. 如果设备仍处于停用状态,或者 iTunes 没有自动同步您的设备,请将设备与 iTunes 同步。
3. 备份和同步完成后,请恢复您的设备。
4. 当 iOS 设置助理要求设置设备时,请选取“从iTunes 备份恢复”。
5. 在 iTunes 中选择您的设备,然后选取最近的设备备份。
如果您从未将设备与 iTunes同步,或没有权限访问电脑
如果您看到以下警告之一,则需要抹掉设备上的数据:
“iTunes 未能连接到 [设备],因为它已被使用口令锁定了。您必须在
[设备]
上输入口令,然后才能与 iTunes
配合使用它。”
“您尚未选择让 [设备]
信任此电脑”
如果您已启用“查找我的 iPhone”,则可以使用“远程擦除”来抹掉设备上的内容。如果您已使用 iCloud 来备份,或许能在抹掉设备内容后恢复最新的备份并重设密码。
或者,将设备置于恢复模式并将其恢复以抹掉设备上的内容:
1. 断开 USB 线缆与设备的连接,但保持线缆的另一端与电脑的 USB 端口相连。
2. 关闭设备:按住睡眠/唤醒按钮数秒,直到出现红色滑块,然后滑动该滑块。等待设备关闭。
3. 按住主屏幕按钮,同时将 USB 线缆重新连接到设备。设备应会打开。
4. 继续按住主屏幕按钮,直到出现“连接iTunes”屏幕。
5. iTunes 将提醒您,其检测到一个处于恢复模式的设备。点按“好”,然后恢复设备。
其他信息
了解有关设置和使用密码的信息。
您可以将设备配置为在连续十次输入错误密码后自动抹掉。此设置在默认情况下未启用。可通过轻按“设置”>“密码锁定”来打开此设置。
17 block避免循环引用
由于我们很多行为会导致Block的copy,而当Block被copy时,会对block中用到的对象产生强引用(ARC下)或者引用计数加一(non-ARC下)。
如果遇到这种情况:
1 2 3 4 5 6 7 8 9 |
@property(nonatomic, readwrite, copy) completionBlock completionBlock;
//======================================== self.completionBlock = ^ { if (self.success) { self.success(self.responseData); } } }; |
对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强应用,那么变量本身和他自己的Block属性就形成了循环引用。在ARC下需要修改成这样:
1 2 3 4 5 6 7 8 9 |
@property(nonatomic, readwrite, copy) completionBlock completionBlock;
//======================================== __weak typeof(self) weakSelf = self; self.completionBlock = ^ { if (weakSelf.success) { weakSelf.success(weakSelf.responseData); } }; |
也就是生成一个对自身对象的弱引用,如果是倒霉催的项目还需要支持iOS4.3,就用__unsafe_unretained替代__weak。如果是non-ARC环境下就将__weak替换为__block即可。non-ARC情况下,__block变量的含义是在Block中引入一个新的结构体成员变量指向这个__block变量,那么__block typeof(self)weakSelf = self;就表示Block别再对self对象retain啦,这就打破了循环引用。
Block的引用循环问题 (ARC& non-ARC)
http://www.hrchen.com/2013/06/retain-cycle-in-block/
a-look-inside-blocks-episode-1
http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/
a-look-inside-blocks-episode-2
http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2/
a-look-inside-blocks-episode-3
http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/
18 runloop
(good)Objective-C之run loop详解
http://blog.csdn.net/wzzvictory/article/details/9237973
(good)iOS多线程编程指南(三)Run Loop
http://www.dreamingwish.com/dream-2012/ios-multithread-program-runloop-the.html
19 iOS多线程开发指南
iOS多线程开发指南
http://www.dreamingwish.com/dream-category/toturial/ios-mulit-thread-program-guide
iOS多线程编程指南(一)关于多线程编程
iOS多线程编程指南(二)线程管理
http://www.dreamingwish.com/dream-2012/ios-multi-threaded-programming-the-thread-management.html
iOS多线程编程指南(三)RunLoop
http://www.dreamingwish.com/dream-2012/ios-multithread-program-runloop-the.html
iOS多线程编程指南(四)线程同步
20 GCD(Grand Central Dispatch)教程
发布者:Seven‘s - 2012/03/03 - 分类:梦印象
Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。
入门教程:
- GCD介绍(一): 基本概念和Dispatch Queue
- GCD介绍(二): 多核心的性能
- GCD介绍(三): Dispatch Sources
- GCD介绍(四): 完结
进阶:
- GCD实战一:使用串行队列实现简单的预加载
- GCD实战二:IO资源竞争
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。