除了NSobject以外,所有的类都有父类。默认的父类一般是NSobject。
我们建立一个名为person,继承NSobject的子类,来方便下面的讨论。
//初始对象
person *niang=[[person alloc] init];
//1 这个方法是判断有没有这个实例方法,返回值是bool类型。有,返回1,没有,返回0。只能判断实例方法。
BOOL a=[person instancesRespondToSelector:@selector(print)];
NSLog(@"%d",a);
//2 功能和上一个函数一样,这是这是一个实例方法。
BOOL a1=[niang respondsToSelector:@selector(print)];
NSLog(@"%d",a1);
//3 判断有没有遵守这个协议。
Protocol *NSCoding;
BOOL b=[person conformsToProtocol:NSCoding];
NSLog(@"%d",b);
//4 nsobject的一个类方法,会得到一个指向这个实例方法的一个函数指针
IMP nprint=[person instanceMethodForSelector:@selector(print)];
nprint();
//5 nsobject的一个实例方法,会得到一个指向这个实例方法的一个函数指针
IMP nprint1=[niang methodForSelector:@selector(print)];
nprint1();
//6 运行时替换person中print方法的实现,用replace这个方法实现(前提是你把这个方法实现了),用个方法时注意这四个参数的类型。
IMP replace=[niang methodForSelector:@selector(replace)];
class_replaceMethod([person class], @selector(print),replace, NULL);
[niang print];
//7 这个方法的作用:给person这个类添加一个nothing的方法,方法的实现是replace
class_addMethod([person class], @selector(nothing),replace, NULL);
[niang performSelector:@selector(nothing)];
//上面两个方法说明了 oc是一门动态语言。
//8 我们调用实例方法时“[]”就是下面的内容
// objc_msgSend(niang,@selector(print));
我们在创建一个 名为 son 继承于person的子类。
son *son1=[[son alloc] init];
9 如果我们在子类中实现了与父类同名的方法,子类的对象调用该方法时,是调用子类自己的那个方法。
//10 本质上,用%@打印对象的时候,打印的是该对象调用的description方法所返回的字符串。
NSLog(@"%@******%@",[son1 description],son1);
//11 该方法判断 son1是不是person类的对象。这里返回的是1(子类的对象都是属于父类的)
BOOL c=[son1 isKindOfClass:[person class]];
NSLog(@"%d",c);
//12 该方法功能与上面一样,但是是严格匹配类型。在这个方法中,子类的对象不是属于父类的了。所以这里返回的时0
BOOL c1=[son1 isMemberOfClass:[person class]];
NSLog(@"%d",c1);
NSobject的基本方法使用,布布扣,bubuko.com