iOS开发之oc(八)--知识补充:id类型和init方法补充
知识补充
一、 id
1. 简介
万能指针,能指向任何OC对象,相当于NSObject *
id类型的定义
typedef struct objc_object { Class isa; } *id;
2. 使用
// 注意:id后面不要加上*
id p = [Person new];
3. 局限性
调用一个不存在的方法,编译器会马上报错
这时可以用instancetype替代id
二、 init方法补充(重点)
1. 对象创建原理
new的拆分两部曲
> 分配内存(+alloc)
>初始化(-init)
Person *p1 = [Person alloc]; Person *p1 = [p1 init]; 合成一句后: Person *p = [[Person alloc] init];
2. init方法的重写
> 想在对象创建完毕后,成员变量马上就有一些默认的值
> 就需要重写init方法
过程如下
- (id)init {
// 1.一定要调用super的init方法:初始化父类中声明的一些成员变量和其他属性
// 2.如果初始化成功,才有必要进行接下来的初始化 if (self = [super init]) { // 初始化成功 _age = 10; } return self; // 3.返回一个已经初始化完毕的值 }
3.自定义构造方法
-
返回值是id类型
-
方法名都以init开头
1>构造方法的一些规范
-
- (id)initWithAge:(int)age { if (self = [super init]) { _age = age; } return self; }
2>传递多个参数进行初始化
-(id) initWithAge:(int)age andNo:(int)no // 就是这里不同而已 { if(self = [super init]) { _age = age; _no = no; } return self; }
三、小知识点补充:
(1)
nil:如果要把对象赋值为空 用nil
Nil :如果要把基本数据类型赋值为空 用Nil
void * :可以指向任何数据类型的变量
id类型: 可以引用任何类实例化的对象 ,在给所引用的对象发消息时不需要强转
【self和super关键字】
self:接受消息的对象或类,当前对象的指针 (通过那个对象使用到self,self 就是谁)。
super:接受消息的对象的父类,用于调用父类的成员方法。
(2)对象的内存表示
//父类的成员变量
//父类的成员方法
//自身的成员变量
//自身的成员方法
(3)复合对象
用面向对象的思想把大象装进冰箱
对象 成员变量 成员函数 类
大象 age/weight/height setter/getter Elephant
冰箱 Elephant * ele opendoor/storeelephant/closedor Haier
(4)NSLog输出增强
-
__FILE__ :源代码文件名
-
__LINE__ :NSLog代码在第几行
-
_cmd :代表着当前方法的SEL