标题:
iPhone开发经验教训总结
[打印本页]
作者:
lin89263
时间:
2012-9-18 14:09
标题:
iPhone开发经验教训总结
所有的
UI
操作
,
都要切换到主线程中进行
.
否则
,
会发生莫名其妙的错误
.
在主线程中,
runloop
默认是开启状态的。非主线程中,如果要用到
runloop
,必须手动开启
runloop
。关于
runloop
知识。
对于常见的
EXEC_BAD_ACCESS
,
EXC_BAD_INSTRUCTION
,错误,一般都是因为访问已经被
release
的对象造成的。尤其是在一个线程中访问另外一个线程的
autorelease
库中的对象,尤其要注意此类问题。
严格遵守
iphone
内存管理手册
,
对于不是由你创建的对象
,
不要越权
release,
否则
,
可能会导致程序
crash.
有时
,
一些看起来非常严重的
bug,
在经过
N
过次努力
,
多种思路尝试
fix
之后
,
再回头分析
bug
产生的原因
,
你会发现
,
造成这个严重
bug
的原因
,
很可能是你违反了一个众所周知的规则引起的
.
这个规则你非常清楚
,
熟悉
,
但就是在
coding
的时候
,
稍不留神违反了它
.
于是就带来了灾难性后果
.
除了面向对象的
cocoa
外,
iphone
编程不要忘记非面向对象的
CoreFoundation
。面向对象库里很多没有的功能,可以尝试在
CoreFoundation
里找找。披如:
RSA
算法,
MD5
算法,
SHA1
算法,
AES
加密算法等,
cocoa
对象库里并没有相应的实现,但在
corefoundation
里,均有相应的实现。
NSString
类里没有的字符串编码
GBK
,
GB2312
,
GB18030
等,在
CoreFoundation
里,能找到相应的编码。建立
socket
连接,获得输入流和输出流时,也需要使用
CoreFoundation
里的
CFNetworkapi
。等等。
通过设置
NSZombieEnabled
参数,有非常有效帮助解决内存释放错误。
在消除某个对象时,如果为该对象设置了
delegate,
则需要先将
delegate
设成
nil
,这是一种良好的代码习惯。
在
3.0
的
Simulator
上使用
Instruments
检测内存泄漏时
,
无法看到函数名
,
只能看到一些地址指针
.
在
3.1,3.1.2,3.1.3
的
simulator
都正常
,
能够正常地看到是在哪个函数中存在的内存泄漏
.
通过
Nib
文件加载
viewcontroller
的各种
UI
控件时时,在
viewDidLoad
函数里,
viewController
的控件才能使用。在
viewcontroller
的构造函数里,
nib
里的控件都还没有完成链接构造呢。
iPhone
程序崩溃不要着急。可以结合使用
Console
和
objc_exception_throw
可以快速定位根源所在。
在
CFNetwork
中,有时候使用
CFWriteStreamWrite
方法写数据时,会导致该现成被长久
block
住。原因:在
CFWriteStream
不能接受数据时,写数据了。具体解决办法:在
CFSriteStream
收到异步的
kCFStreamEventCanAcceptBytes
通知时,再开始写数据。此时可避免
CFWriteStreamWrite
导致线程被
block
的情形。
使用
Eavesdrop
抓取网络数据包。
在
Iphone
上有两种读取图片数据的简单方法
:UIImageJPEGRepresentation
和
UIImagePNGRepresentation.UIImageJPEGRepresentation
函数需要两个参数
:
图片的引用和压缩系数
.
而
UIImagePNGRepresentation
只需要图片引用作为参数
.
通过在实际使用过程中
,
比较发现
:UIImagePNGRepresentation(UIImage*image)
要比
UIImageJPEGRepresentation(UIImage*image,1.0)
返回的图片数据量大很多
.
譬如
,
同样是读取摄像头拍摄的同样景色的照片
,UIImagePNGRepresentation()
返回的数据量大小为
199K,
而
UIImageJPEGRepresentation(UIImage*image,1.0)
返回的数据量大小只为
140KB,
比前者少了
50
多
KB.
如果对图片的清晰度要求不高
,
还可以通过设置
UIImageJPEGRepresentation
函数的第二个参数
,
大幅度降低图片数据量
.
譬如
,
刚才拍摄的图片
,
通过调用
UIImageJPEGRepresentation(UIImage*image,1.0)
读取数据时
,
返回的数据大小为
140KB,
但更改压缩系数后
,
通过调用
UIImageJPEGRepresentation(UIImage*image,0.5)
读取数据时
,
返回的数据大小只有
11KB
多
,
大大压缩了图片的数据量
,
而且从视角角度看
,
图片的质量并没有明显的降低
.
因此
,
在读取图片数据内容时
,
建议优先使用
UIImageJPEGRepresentation,
并可根据自己的实际使用场景
,
设置压缩系数
,
进一步降低图片数据量大小
.
北邮
3G
培训基地:
http://www.3gtrain.com/
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0