iphone应用程序开发指南(读书笔记)
UIKit框架负责管理大部分关键的基础设施。UIApplication负责接收事件,响应事件则需要你的定制代码来处理。
委托是一种避免对复杂的UIKit对像,进行子类化的机制。(关乎设计模式)
触摸数据被封装在时间对象(UIEvent)中,为了跟踪触摸动作,时间对象中包含一些触摸对象(UITouch),每个触摸对象对应于一个正在触摸屏幕的手指。
在启动一个应用程序时,系统为程序创建一个进程和一个单一的线程。
可以使用NSRunLoop类来安装自己的输入源,包括端口和定时器(多线程编程)
响应者对象是继承UIResponder类的对象。应用程序的响应者包括UIApplication,UIWindow,UIView,一级所有UIView的子类的实例。
控件对象(UIControl)
iphone的基本设计模式
模型-视图-控制器(MVC) 委托 目标-动作(就是连接button和对应的函数) 委托内存模型(oc使用引用计数模式来确定什么时候应该释放内存中的对象。一个对象,开始被创建,计数为1.然后retain,release,autorelease可以怎级啊或减少引用计数。当引用计数为0,oc会清理例程)
程序退出时间不要超过5秒
将共享的UIApplication对象的idleTimerDisabled属性设置为YES,就可以禁用自动休眠定时器。
Info.plist中的重要键值:
UIRequiresPersistentWiFi 这是个boolean值,用于通知系统应用程序是否使用Wifi
UIApplicationDelegate协议
applicationDidFinishLaunching:将应用程序恢复到上一个会话的状态。也可以在这个方法中执行应用程序数据结构和用户界面的定制初始化。
applicationWillTerminate:将未存数据或者关键的应用程序状态存入磁盘。也可以执行额外的清理工作,如删除临时文件。
当有电话等程序进来时,会调用applicationWillResignActive:方法,让用户确定是否进行新的任务。若用户忽略,调用applicationDidBecomeActive:方法,重新继续原来的程序。若用户响应新事件,则applicationWillTerminate:方法。
接受低内存警告:(理论上必须要有的)
在委托中实现applicationDidReceiveMemoryWarning:方法。
在UIViewController子类中,实现didReceiveMemoryWarning方法
注册UIApplicationDidReceiveMemoryWarningNotification通知。
景观模式+肖像模式(横屏竖屏的问题)
Info.plist文件中加入UIInterfaceOrientation键,设为景观模式:UIInterfaceOrientationLandscapeLeft或者UIInterfaceOrientationLandscapeRight
或者重载shouldAutorotateToInterfaceOrientation:方法。
和其他应用程序通讯:使用NSURL。(不是太理解,不大符合常理。是说用socket通讯?)
NSURL *myURL = [NSURL
URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];
如果您选择在应用程序内进行偏好设置管理,则可以自行定义用户界面及编写代码来实现。
但是,如果您选择使用Settings 程序,则必须提供一个设置包(Settings Bundle)来进行管理。
将共享的UIApplication 对象的idleTimerDisabled 属性设置为YES,就可以禁止屏幕锁定。
国际化--我们约定,本地化语言子目录称为lproj 文件夹。举例来说,如果要指定美国英语的本地化资源,程序包中的子目录应该命名为en_US.lproj。
主线程是应用程序处理触摸事件和其它用户输入的地方。为了确保应用程序总是可以响应用户,我们不应该在主线程中执行运行时间很长或可能无限等待的任务,比如访问网络的任务。相反,您应该将这些任务放在后台线程。一个推荐的方法是将每个任务都封装在一个操作对象中(具体是什么意思,大哥,不懂啊),然后加入操作队列。当然,您也可以自己创建显式的线程。
由于iPhone OS 的虚存模型并不包含磁盘交换区空间,所以应用程序在更大程度上受限于可供使用的内存
消除内存泄露:可以用Instruments 程序来跟踪代码中的泄露
使资源文件尽可能小:您可以通过NSPropertyListSerialization 类将属性列表
文件存储为二进制格式;对于图像,可以将所有图像文件压缩得尽可能小(PNG 图像是iPhone应用程序的推荐图像格式,可以用pngcrush 工具来进行压缩)。
使用Core Data 或SQLite 来处理大的数据集合:
延缓装载资源:
将程序连编为Thumb 格式:
减少自动释放对象的使用:通过autorelease 方法释放的对象会留在内存中,直到显式清理自动释放池或者程序再次回到事件循环。在任何可能的时候,请避免使用autorelease 方法,而是通过release 方法立即收回对象占用的空间。
为资源设置尺寸限制:您可以通过mmap 和munmap 函数来将文件的一部分载入内存或从内存卸载,而不是操作整个文件
避免无边界的问题集:
如果您的代码确实广泛地使用浮点数计算,请记住不要使用-mthumb 选项来编译代码。Thumb 选项可以减少代码模块的尺寸,但是也会降低浮点计算代码的性能。
您应该总是采用Instruments和Shark 工具对应用程序的算法进行优化
避免需要轮询的工作,因为轮询会阻止CPU 进入休眠状态。您可以通过NSRunLoop 或者NSTimer 类来规划需要做的工作,而不是使用轮询。尽一切可能使共享的UIApplication 对象的idleTimerDisabled 属性值保持为NO。当设备处于不活动状态一段时间后,空闲定时器会关闭设备的屏幕
仅在需要的时候连接外部网络,不要对服务器进行轮询。
当您需要连接网络时,请仅传递完成工作所需要的最少数据。请使用紧凑的数据格式,不要包含可被简单忽略的额外数据。
尽可能快地以群发(in burst)方式传递数据包,而不是拉长数据传输的时间。当系统检测到
设备没有活动时,就会关闭Wi-Fi 和蜂窝无线信号。您的应用程序以较长时间传输数据比以较短时间传输同样数量的数据要消耗更多的电能。
尽可能通过Wi-Fi 无线信号连接网络。Wi-Fi 耗电比基带无线少,是推荐的方式。
屏幕矩形可以通过UIScreen 对象来取得,具体代码如下所示:
UIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
。一个屏幕的视图后面是一个视图控制器其作用是管理那些视图上显示的数据,并协调它们和应用程序其它部分的关系。
如果视图被标识为需要重新布局,UIKit 就调用视图的layoutSubviews 方法。
如果视图的任何部分被标识为需要重画,UIKit 就调用该视图的drawRect:方法。】
下面这些事件处理方法:
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
layoutSubviews 方法
drawRect:方法