NSObject和id都属于万能指针,都可以指向任何对象。以下简单介绍一下不用用法和区别:
一、NSObject类型指针
由于NSObject是一切类的根类,因此,NSObject类没有其它创建对象的一些方法和属性,因此,编译器在编译时,NSObject类型指针指向的对象调用其对象方法和属性时会报错。可以用强转换来表明属于哪种类型,具体格式为:NSObject *obj = XXX; [(类名 *)obj 方法1];若“方法1”是obj对象的方法,则会执行该方法。
二、id类型指针
id可以指向任何OC对象,是通过typedef定义的类型,使用时不用加*。当使用id指针指向其它对象时,编译器会直接跳过不会检查。id类型指针对象可以调用方法,但是不可使用点语法(可以使用set get方法)。子类或者父类调用[self new],返回的是自己类型的对象,可以用id类型接收。但是id太灵活,没有限制容易出问题。因此,可以用instancetype作为返回类型。(instancetype类型只可以用作返回值使用)。id仅仅是纯地址,不包括类型,instancetype代表当前返回的对象的类型。
@implementation Person
-(void)sample{
NSObject *name1 = self.name;
id name = self.name;
}
@end
另外:如果判断该指针指向的对象是否拥有某方法,参考文章SEL方法说明。