iPhone开发中的问题整理
From:http://www.2cto.com/kf/201108/99455.html
看到很刚开始开发iPhone软件的朋友问很多问题,其实同样的问题我也碰到过, 所以抽时间把能想到的或者碰到的问题汇总一下, 一来可以给自己做个备忘也可以和朋友们分享探讨。
1. iPhone SDK 开发能不能使用C / C++ 语言?
Answer:iPhone SDK的开发的基础框架是基于cocoa库的,Objective-C 是cocoa的开发语言, 但基于Objective-C的特性,在iPhone程序中可以使用C/C++进行功能开发以及使用第三方C/C++库。
2. 如何才能使用 C /C++?
Answer: 当你需要使用C/C++时, 可以将类实现的文件名改为.mm, 这样编译器就知道改文件中包含C/C++代码 (注:此时在工程属性的编译选项必须设定为根据文件类型或者objective c++或者C++, 具体位置:GCC 4.0 -Language -> Compile Sources As )
3. Objective-C类属性关键字nonatomic时什么意思?
Answer: 这时Objective-C的特性, 改关键字用来告诉编译器在自动生成访问器代码时该如何处理线程安全。默认情况下所有属性都是atomic也就是线程安全的,但因为运行效率较低。考虑到效率,一般都采用nonatomic,然后自己做线程安全的处理。
4. 如何避免因为内存不足导致程序崩溃?
Answer: iPhone程序可用的内存很小, 苹果官方没有给出明确的上限, 但根据互联网上其它开发人员的总结最多不超过20MB,这一数字未经证实,但我曾碰到过程序在分配13Mb内存的时候就频频crash情况。 所以, 要想避免由于内存不足导致的不稳定,还是按照苹果的建议
Load resources lazily, 就是所有资源都是在使用的时候再加载,用完立刻释放。 比如,你的程序需要3张图片在某个View中显示,以往的桌面程序的做法是在程序启动的时候加载该3张图片到内存, 用的时候直接调用内存以提高效率。 但这样的做法在iPhone中不可取,iPhone对于资源的原则是随用随取,用完释放。
对象的分配也尽量避免使用autorelease,善用NSAutoreleasePool 内存池。尤其是在循环中。
大数据量采用SQLite存储, 存储快、效率高
绝对避免内存泄露,iPhone程序崩溃往往是拥有内存泄露导致,可以使用xcode->Run->Start With Performance Tool -> Leaks 来检查泄露情况
5. 如何保存程序中的用户输入信息?
Answer: 有时候需要保存用户输入的信息数据或者程序的状态,最好的方式是采用plist存储。 用plist存储优点甚多,NSArray、NSDictionary等容器类都支持直接输入输出plist格式的文件。 但需要注意的是, 输入、输出的文件格式和相应容器类要保持一致。 也就是说,使用[array writeToFile] 输出的plist文件必须用[array arrayWithContentsOfFile:]来读取,如果混用了array和dictionary则会导致程序崩溃。
6. 如何弹出网络链接对话框?
Answer: 如果程序中用到网络,按照app store的规定需要弹出网络连接对话框提示用户。只需要在Info.plist文件中添加信的条目:UIRequiresPersistentWiFi 类型为Boolean,值为YES即可。
7. 如何显示顶部状态栏中的网络忙指示器?
Answer: 设置networkActivityIndicatorVisible = YES即可, 不需要时将其赋值NO即可
8. 如何在程序图标上显示数字?
Answer: 在程序退出或者改变时修改[UIApplication sharedApplication].applicationIconBadgeNumber的值即可
9. 如何比较两个NSString字符串是否一样?
Answer: 使用NSString类的isEqualToString: 方法来判断字符串是否相同,也可以使用[NSStringObject compare:]==NSSameOrder, 注意:isEqual用于判断两个对象是否一样而不是内容
10. 如何改变导航条的背景颜色?
Answer: 如果时在ViewController中修改则使用类似如下代码:
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.03 green:0.215 blue: 0.298 alpha:1];