前言:
学完了底层c,c++之后,现在开始重新回头进行上层的界面设计。既然做了就要做好,就如同过去c,c++做的一样。过去的一年的时间精看了深入浅出mfc,C++程序设计语言,effective-c++,GOF和大话设计模式,粗看了more effective c++, c++ premier,linux程序设计,harly guide linux, 自觉在c++方面的战果还算不错,现在重新捡起刚从事半年多的ios,一方面是因为money,另一方面是因为过去确实底层能力不行,对于界面处于知其然而不知其所以然的状态,现在重新看起,书籍一定是必需品了。买了两本书,ios开发指南和ios设计模式解析。这一段博客主要记录书籍的学习过程,还有过去的未竟的任务,将好的思想,好的策略浓缩一下便于为我所用。
ios开发指南
国人写的书,一直对国人的技术书籍有种抵触情绪,不过看这本书的目录结构比较适合我,于是放弃了精通ios开发那本而选择了这本。这本书有点太厚了,接近700页,拿在手上不适合,太重,讲的东西多,但是不算杂,各项均有涉及,有个别错误,内容不算高深,适合我这样的小半桶水看。ios设计模式解析是没有时间看了,先让它睡着吧,把基本的捡起来以便于自己好迅速的上手公司的代码,要不然以后工作有我受的了。
第一章
xcode简介,书籍图片,内容介绍,书中源码链接。没啥有太大意义的内容。
第二章
应用程序的生命周期值得读一读。
打开程序: Not Run (applicationDidFinishLauch) -> InActive (ApplicationDidBecomeActive)-> Active
程序后台: Active (applicationWillResignActive) -> InActive -> Backgroud (applicationDidEnterBackgroud)-> Suspend (applciationWillTerminate) -> Terminate
挂起运行: Suspend -> Backgroud (applciationWillEnterForgroud) -> InActive (applicationWillBecomeActive) -> Active
当系统内存不足的时候,后台的Suspend程序有可能会被系统kill掉,没有通知。
视图的生命周期
loadView(得到一个view) -> ViewDidLoad(在生成的view后添加subview以进行自我的定制) -> ViewWillAppear -> viewWillDisappear -> didReceiveMemoryWarnning (收到内存警告) -> viewDidUnLoad
loadView是为了创建self.view,当从nib文件中去加载就会直接创建self.view,因此loadView也就不需要了。
Xcode的project和target
一个project对应这多个target,project的设置是公共的,target的设置可以覆盖project的设置。在target的summary选项下,设置屏幕图标57*57, Icon.png,retina屏幕为Icon@2x.png, 启动屏幕为320*480,Default.png或者retina屏幕为Default@2x.png, 设备支持选项。
ios Api简介
框架太多,不容易记忆,再说必要性不是很大。注意大的有四个层次: Cocoa Touch, Media, Core Services, Core OS。具体的每一个层次包含什么,暂时不关心。还有如何使用帮助文档,alt+鼠标点击-》打开帮助文档
第三章 基本的设计模式
ios常用设计模式,这个我比较擅长,相对就简单多了。
单例模式
没有使用synchronized机制,使用gcd的一种dispatch_once机制来维护仅仅执行一次的操作,比加锁效率高一些,至于内部原理,暂时不懂,不过以后会搞定它的底层的。来个简单代码示例便于以后copy
@interface Singleton : NSObject
@end
@implementation Singleton
static Singleton *_shareSingleton = nil;
+ (Singleton*) sharedManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
_shareSingleton = [[Singleton alloc]init];
//...... your other initial code here
}
);
return _shareSingleton;
}
思想很简单,私有静态指针,类方法中分配内存并返回这个指针。为了防止多线程同时访问可能会创建几个对象,可以采用加锁,为了提高效率,有一种二次探测的策略;这里采用的GCD的内容保证只执行一次。
示例: UIAccelerometer NSUserDefault NSNotificationCenter等等。
委托模式
我比较挠头的一种模式,说起来就是我定义了一个框架,但是又想给使用者以个性化的操作,于是将个性化的操作提取出来,制作成协议,让客户去实现协议。举个UITableView的例子, ViewController实现UITableViewDelegate协议, viewController持有一个UItableView的指针,设置tableView.delegate = self。这样tableView相当于将个性化的操纵留给了ViewController去完成了。
简单类图:
UITableViewDelegate
|
|
UITableView (持有delegate指针)------------->MyViewController(持有tableView指针,并设置delegate)
MyViewController继承delegate同时持有tableView的指针,这个是一个强引用。UITableView也持有一个delegate指针,由于这个指针最终要赋值为MyViewController对象,因此为了避免循环引用,一定是一个弱引用。一般是在MyViewControlller中设置tableView.delegate为自身,也就是说MyViewController负责实现delegate方法。这样UITableView自身实现了TableView的基本框架,同时将用户的个性化的可扩展的地方弄成协议供客户实现。协议的调用肯定是UITableView内部框架去做的,它需要数据的时候就去协议要数据,协议呢给用户以最大的扩展性,同时用户有不用关心UITableView具体的内部是如何呈现了,用户只需要提供数据就行了。示例 UITextField Application
观察者模式
相当简单的一种设计模式,但是又相当常用。一定要记住一个Subject,n多个Observer。Subject需要实现addObserver,removeObserver,notifyAllObservers的方法,同时有一个observers数组保存所有的observer;observer需要实现update方法。当需要更新数据的时候,调用notifyAllObservers方法,这个方法中遍历数组的所有observer,调用observer的update方法去更新数据。通知中心就是一个subject,为了方便使用它以单例模式实现的,后面有空要实现一个通知中心,让自己理解更深刻一些。
KVO也是一种观察者模式,KVO会自动给Subject类创建一个子类,然后将Subject类的isa指针指向派生类.在派生类内部添加通知观察者的代码,需要使用setValueForKeypath的方式,因为这种方式的派生类内部才添加了notifyObserver的方法。添加属性观察的Subject需要调用addObserver方法来添加观察者,当属性改变,观察者的ObserverForKeyPath会呗调用。这个有空也实现一个,应该不算复杂,主要是内部机制自己理解还不是很透彻。
MVC模式
Cocoa中的MVC的模型和视图没有任何交互,全是通过中间人ViewController交互的。
ViewController持有很多View的对象指针(IBOutlet),因此可以直接操纵view,view可以通过委托和协议的机制将操作反馈给ViewController,还有button的回调(IBAction)也可以反馈到Controller。
Controller也一般持有model的指针,可以直接更新model数据;model数据可以使用Notification和KVO机制将model的更改通知给Controller。上面的这几个策略基本上概括了整个MVC的东西,斯坦福公开课有一个图片很好,大家值得一看。
OK,就到这里吧,得回家了,太晚了,明天继续写。