一、对Objective—C的了解与学习方法
1.1 ObjC介绍
Objective-C是由Brad Cox和Tom Love在1980年代发明,是一种在C语言的基础上进了面相对象的扩展编程语言。其特点是支持C/C++混编,同时也是苹果指定的应用程序开发语言。其通过LLVM编译器构架,支持与最新的Swift语言双向操作。
1.2 学习方法
学习高级编程语言时,应该在两个方面下功夫,一是底层思维,理解代码在底层的运行逻辑,其二是抽象思维,能将实际功能抽象为代码或者数据模型。分析一段代码时可以用“时空人”三位一体分析法,知道这段代码发生在什么时候(time),变量放在哪里(room),代码从哪里来的(man)。最后要经常查看与学习苹果的官方文档。
二、OC中的类
2.1 类与结构的对比
类生成实例对象,其为生成在栈上的指针类型,methodlist和属性的值保存在堆上面。当使用copy方法copy一个对象时,copy的对象的属性值改变,被copy的对象属性值随着改变。
结构生成值,其为生成在栈上的实体对象。用copy方法拷贝值时,单独在栈上保存一份数据,copy值的改变不影响原值。
传参情况同拷贝。
2.2 属性
属性的定义:@property(XXX)数据类型 属性名。
定义属性时,编译器会自动做三件事:
1. 定义“_”+属性名的实例变量
2. 定义一个getter方法,用以在类外获取属性的值。
3. 定义一个setter方法,用以在类外为属性赋值。
OC提供 对象名+点语法访问属性。 例: self.propertyName。其中self指在执行这段代码时,当前类的实力对象。
属性还有几种修饰关键字:
readwrite(default ):可读可写;readonly:只读;atomic(default):原子性;nonatomic:非原子性(在多线程中,原子性属性是必须等占有当前属性的操作完成了,其它才能调用,非原子性反之);strong(default):强引用;weak:弱引用(weak能防止循环引用,致使内存不能被释放)copy:拷贝属性(创建独立拷贝)
2.3 方法
在.h文件中(即接口)定义方法名,以暴露方法对外的接口。实现部分写在.m文件中。
“—”为对象方法,调用时用[对象名 方法名];“+”为类方法,调用时用[类名 方法名];
*注意:OC中方法默认都是共有方法。但是可以不暴露接口(不在.h中声明)致使只能在类内使用。
定义方法:-/+ (返回值类型)方法名:(参数类型)参数名 第二参数名(参数类型)参数名`````;例:-(id)initWithName:(NSString* )name Age(int)age;
类中特殊的方法:初始化器init。初始化类的对象时用 [类名 alloc]init];这是通用的最简单的初始化方法,其中alloc是为对象分配内存,并且使内存至0。init是对象初始化方法,其首先调用基类的初始化方法,并实例化对象,其实现代码如下:
self=[super init];//调用父类的初始化方法。
if(self){
XXXXXXX
}
return self;//返回对象
OC中也有new方法,其相当于无参的alloc/init。
-(void)dealloc是析构器,其作用是释放对象拥有的资源,是返回值为空的函数。有系统调用,无法手动调用。
OC是动态方法调用机制,所以self调用当前对象的方法。其也使OC的方法调用效率稍微偏低。
三、面向对象
3.1 继承和多态
继承、多态和封装是面向对象三大特点,在OC中子类将继承父类如下数据1.实例变量 2.属性 3.实例方法 4.类方法。
NSObject是所有类的基类。
继承的两层涵义:成员复用,子类复用基类成员。类型抽象,将子类当作父类使用(IS-A关系)。
内存关系:继承父类的子类,将重新获得堆内存,以保存继承自父类的实例变量、属性、实例方法和类方法。
子类重写父类的行为,称为多态。OC中不允许方法的重载(方法名,变量名相同,参数类型不同)。
* self具有多态性,能指向不同的子类。super没有,仅指向当前父类。
注意:尽量避免在父类init和dealloc中调用父类重写的方法。