黑马程序员---id

来源:互联网 发布:工频变压器设计软件 编辑:程序博客网 时间:2024/06/01 12:29

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

id 是万能指针,能指向\操控任何OC对象

id类型的定义:

typdef struct objc object{

Class isa;

} *id;

注意:

1. 因为id是一种类型,所以不可以写 id id; 就像是不可以写 int int; 一样,关键字不可以做标识符。

2. id内部已经包含*了,所以在id类型后面不需要再加*了。

id == NSObject *   id相当于NSObject *

因为凡是OC对象都是由指针来操作的,而大多数OC对象基本上都是继承自NSObject,如下:

NSObject *o = [Person new]; // 可以用父类指针指向子类对象,也就是多态,而id是万能指针,能指向并操作任何OC对象,所以id相当于NSObject *,因此任何继承NSObject类的对象都可以用id来着操作。

如果在Person类的声明中使用@property声明一个id类型的变量

@property id obj; // 说明成员变量是id类型的,任何OC对象都可以作为他的属性

那么在主函数中调用的时候可以传任何OC对象,因为参数类型不确定,所以可以传任何OC对象,所以id类型也就有了局限性。

局限性:调用一个不存在的方法,编译器会马上报错。

在使用id类型时出现的一个错误:

在Person的声明中用了@property int age;然后在主函数中创建对象调用他的set和get方法。直接调用都可以,但是用点语法的时候就出现了下面的错误。


本来以为是用了@property的关系,但是_age的声明和它对应的set和get方法我手动写出来后,还是这个错误。

原因:id类型是不可以使用点语法的,id类型是OC中独有的数据类型,在内部处理上,这个类型被定义为指向对象的指针,点语法是通过对象来调用set和get方法,id是指针,所以不可以调这两个方法。

0 0
原创粉丝点击