voshk

iOS基础开发教材

2015/12/24 Share

背景

地址: https://zonble.gitbooks.io/kkbox-ios-dev/content/

由下而上的学习(bottom-up):

先了解整个开发框架的底层,以及整个框架的基本概念,然后才去一个个去看在这个框架中有哪些 API、以及有哪些第三方 library 可以使用

学习新知识的时候,学会这样挑战自己,确认自己是否完全理解自己想要学习的东西

我有没有办法用一句话来描述这个东西是什么?还有,它可以用在哪里?

Selector

简短的定义:

Selector 就是用字符串表示某个 object 的某个 method

更专业的说法:

Selector 就是 Objective-C 的 virtual table 中指向实际执行 function pointer 的一個 C 字串

Selector 的用途?

因为 method 可以用字串表示,因此,某个 method 就可以变成可以用來传递的参数

Objective-C Class/Object到底是什么?

oc 是 c 的 superset(超集),在 c 的基础上加了层稀薄的面向对象,cocoa 名字的由来就是 c+OO, 所以在 oc 中可以直接调用 c 的 api,如果将 m 改为 mm,就可以混合 c++ 语法,编程 Objecttive-C++

oc 的代码在 compile time,compiler会将其编译成 c 然后继续编译,所有 oc 的 class会变成c 的 structure,所有的 method 以及 block 都会编译成 c function,最后在执行阶段 runtime才会建立c structure 和 c function 之间的关系,所以一个 clas 到底有多少 method 可以调用是在 runtime 阶段决定的

例子:

1
2
3
4
@interface MyClass : NSObject {
int a;
}
@end

对应的 structure

1
2
3
typedef struct {
int a;
} MyClass;

Selector 用途

  1. target/action pattern
  2. 检查 method 是否存在
  3. timer
  4. 接收 nsnotification
  5. 在某个 thread执行 method
  6. array排序
  7. 代替if-else 与 switch-case
1
2
[object performSelector:NSSelectorFromString(@[@"doSomething",
@"doAnotherThing"][condition])];

给method改名 比替换效果要好的是 选中方法名 右键refactor-rename 替换更多的用在对变量更改名字

Category

不用继承class 直接增加新method,或替换原来的method

原本category只能添加method不能添加新的成员变量 iOS4之后 objc_setAssociatedObject可以实现添加变量

1
2
3
4
5
id a = [[NSObject alloc] init];
id b = [[NSObject alloc] init];
b = a;
[a release];
[b release];

在第三行中,由於 b 指向了 a 原本所指向的記憶體,但是 b原本所指向的記憶體卻沒有釋放,同時再也沒有任何變數指向 b原本指向的記憶體,因此這塊記憶體就發生了記憶體漏水。接著,在第四行呼叫[a release] 時,這塊記憶體就已經被放掉了,但是由於 a 與 b都已經指向了同一塊記憶體,所以第五行的 [b release]也是操作同一塊記憶體,於是會發生 EXC_BAD_ACCESS 錯誤。

lazy loading

Lazy Loading 就是:我們要去使用某個物件的時候,我們才去建立那個物件,避免在物件初始時就建立了所有的property,而達到讓初始物件這個動作加速的效果。

block delegate适用情况

如果一个method 的呼叫只有一个callback 就用block 多个就用delegate

block中的 block weak关键字
block声明的变量在block内部可以更改 weak 解决循环应用的问题

Notifcation Center

当成一种广播系统.
当a改变,而其他b c d 多个需要知道a的状态,a不必跟他们说,而是直接告诉广播中心:我要改变了!!
至于bcd等想知道a状态变化的,需要对这个广播中心订阅相应的通知 ,所以当a发出变化的通知的时候,这个广播中心所有订阅的都会知道这个消息

接收 notification

一个notification包含几个部分:

  1. object :发送者,谁发出了这个通知
  2. name : 这个通知叫啥名字
  3. user info : 这个通知携带的其他信息

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:NotificationName Object:nil]

指定由谁发出 叫什么名字的通知,以及指定负责处理通知的selector object 为nil就是无论这个通知是由谁发出的 都要去处理

name为nil就是接收对应的所有的通知

如果不需要继续订阅通知 通常是在dealloc里头 removeObserver

发送 notification

  • (void)postNotification:(nsnotification *) name object userinfo

设计模式 design pattern

在软件设计中,针对一般问题/并且可以重复使用的解决方案

BOOL和bool

c语言中一开始是没有bool类型的,oc自己定义了BOOL 后来c又有了bool 64位是没啥区别的 BOOL被定义为一个int
32位中被定义为char BOOL和bool的区别就是一个byte 跟4个byte的区别

BOOL转成nsnumber @(YES) @(NO)

NSInteger NSUInteger

nsinteger来自c的整数
64位下nsinteger 为long 32下就是int 同理NSUInterger则是 unsigned long unsigned int

NULL Nil nil

oc中有好多代表不存在没有什么的东西
NULL,nil, Nil,NSNull, NSNotFound

NULL 来源于c 就是指向0的指针

nil oc中的空也是指向0的指针
当我们不想使用mougeobject时候 会将它指向nil 对nil调用任何的method都不会有问题

nsarray nsdictionnary 遇到nil的结尾 就会把之后的截掉

Nil
nil是空的instance Nil则是空的class 想要判断class是不是空的时候 要用Nil而不是nil

NSNULL
oc中真真切切存在的一种类型 class [NSNULL null] “没有东西”

NSNotFound

Responder

从工程师角度来讲:所谓的UI都是幻觉 [手指按到了屏幕上的按钮]这件事情本身并不存在,而制作UI就是在制造幻觉

事件的传递
硬件把事件传递到app中,交给UIApplication分发事件
UIApplication把事件分发到key window,然后key window分发事件
key window开始寻找view heirarchy中最上层的vc中的view 发现最上层的view是个button
触发button的target/action

第一响应者 first responder
相应链 responder chain

runloop

Threading

  1. perform selector
  2. gcd (grand centeral dispatch)
  3. NSOperation, NSOperaionQueue

NSCoding

一个protocol
@protocol NSCoding

  • (void)encodeWithCoder:(NSCoder *)aCoder; //object 转为 nsdata
  • (id)initWithCoder:(NSCoder *)aCoder; //nsdata 转为object

Core Animation

  1. CALayer
  2. CAAnimation
  3. CATransition

calayer想象成演员 caanimation剧本 一个动画就是好多演员按照剧本演出 catransition 剧本演出速度 持续时间的玩意

CALayer 与 UIView的关系

任何一个view都是由两种性质组成的:

  1. 一是可以被操作的 被点击拉啥的,这是一个view作为responder的部分
  2. view展现出来的外观 其实是里头calayer的样子

draw rect 其实是个delegate call 用途不是绘制uiview 而是绘制calayer的内容

重绘calayer时候 会呼叫calayer 的drawInContext