斯坦福大学iOS公开课笔记 1~5

第一课:iOS概述

MVC:
Controller&Model:controller需要知道model的一切,需要有与model完全通信的能力,可以使用所有controller希望使用的公共API;有时数据变化时,controller需要知道,model通过KVO通知controller数据的变化,然后controller则会向model获取变化后的更新的数据,不要用view接受通知,这违反了MVC;

Controller&View:controller同样完全控制view,使view呈现需要的东西;view只能以blind way与controller通信,view不知道通信对方的类。例子:controller提供有关target,当view被操作时,会将该action发送给controller;更复杂的情况(will、should、did)用delegate模式。大型的数据不应该是view的属性,通过data source(特殊delegate)由controller提供数据并显示出来

Model&View:model与view没有任何通信发生,不要让它们发生通信

一个MVC可以作为另一个MVC的View部分

.h文件,是公共API,具有公共性质,提供其他类可以使用的(方法、属性)
.m文件,是私有API及实现文件,在.m 文件中也有 @interface,与.h文件中的@interface不同,这里的@interface声明是私有方法和私有属性的声明,.h 文件中的声明则是公共的, 可被外界获知的

weak 不仅是释放内存,还会让指针指向nil

第二课:Xcode 5

所有对象初始值都是0,包括指针(也就是nil)
定义一个可变数组属性,实现方法往可变数组中添加元素,如果没有初始化该数组,那么self.mutableArray这个getter返回的是一个指向nil的指针,此时程序不会崩溃但是可变数组中没有数据,所以在getter方法中初始化可变数组,给它分配空间并赋值(惰性实例化,即懒加载,view的加载既是懒加载)

同时实现getter和setter后,就要再写@synthesize

第三课:Objective-C

在.h文件中声明为readonly的属性,对外是只读的,但在其内部有时可能需要更改,可在.m文件的@interface私有声明中重新声明该属性,将其设置为readwrite,可读写。在这里同样可以声明各种私有属性

xib连线 有三个选项:Outlet、Action、Outlet Collection,平时拖label等控件到.h 文件或 .m 文件的私有声明部分都是Outlet选项,拖动button到 .m实现方法的是Action选项,当需要outlet多个事物时,可以选 Outlet Collection选项,会得到一个数组,数组默认存放该控件的对象,这一属性默认且必须是strong的;然后将需要加入到该数组的控件一个个拖进该数组(拖入的顺序是未知的);在Action实现方法中可以通过传过来的sender(或其他类型的控件)获知它在数组中的下标。

第四课:框架和带属性字符串

直接使用id,id 就是一个指针,不要用 id* 它表示指向指针的指针。
id 要求id所指对象能对协议中的方法作出反应,id后面跟尖括号实际上介于纯id和静态类型之间,这里静态类型化的不是类型,而是事物能够对其作出反应的消息。
SEL shootSelector = @selector( shoot ) ;
SEL是一种typedef,你可以声明类型为SEL的变量,并将事物存储其中;可以用performSelector 该方法需要一个参数,可以将SEL作为参数传入。
数组中的使用:
[ array makeObjectsPerformSelector : shootSelector ] ; 令数组中所有元素都执行这个方法,可以代替for循环

  • (NSArray * ) sortedArrayUsingSelector : ( SEL )aSelector ;
    混合数组的遍历,用 id 指针,在forin循环中内省来区分具体每个对象属于哪个类
    [ [ NSUserDefaults standardUserDefaults ] synchronize ] 同步,持久存储

第五课:视图控制器生命周期

viewDidLoad 方法适合写init代码,不要写关于几何的代码(即关于视图形状的初始化信息),此时视图的边界并没有定下来
viewWillAppear 方法中,写某些需要基于数据 且这些数据在视图离开屏幕时会改变的初始化方法,对不可见时可能改变的内容进行同步操作;基于几何内容的初始化方法
LayoutSubviews 屏幕适配时调用的方法,如横屏与竖屏
执行顺序:
Instantiated from storyboard -> awakeFromNib -> outlets get set -> viewDidLoad -> viewWillLayoutSubviews: and viewDidLayoutsSubviews -> viewWillAppear: and viewDidAppear -> viewWillLayoutSubviews: and viewDidLayoutSubviews: -> viewWillDisappear:and viewDidDisappear
如果出现内存不足的情况,会得到这个通知:didReceiveMemoryWarning
addObserver方法中最后那个参数object表示你是否只想收听某个特定对象发出的Notification(通常这里写nil)
在center中移除observer,[ center removeObserver : self ] ;
或 [ center removeObserver : self name : NotificationName object : nil ],在中心列表中移除observer
不建议在dealloc中移除observer,建议在 viewDidDisappear 中调用上面方法通过中心列表移除observer

第六课:控制器多态性、导航控制器、选项卡栏控制器

self.view.window 该视图显示在屏幕上,一般用于判断是否更新UI上的数据,如果视图显示在屏幕上,数据改变了 则马上调用更新数据的方法,如果该视图不在屏幕上 则在 viewWillAppear 方法中调用更新数据的方法

你可能感兴趣的:(斯坦福大学iOS公开课笔记 1~5)