标签:
id obj = [Student new];
/*
if ([obj isKindOfClass:[Student class]]) {
// isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类
[obj eat];
}
*/
if ([obj isMemberOfClass:[Student class]]) {
// isMemberOfClass : 判断指定的对象是否是当前指定的类的实例
[obj eat];
}
// alloc做了什么事情: 1.开辟存储空间 2.将所有的属性设置为0 3.返回当前实例对象的地址
Person *p1 = [Person alloc];
// 1.初始化成员变量, 但是默认情况下init的实现是什么都没有做 2.返回初始化后的实例对象地址
Person *p2 = [p1 init];
// [[Person alloc] init];
// 注意: alloc返回的地址, 和init返回的地址是同一个地址
NSLog(@"p1 = %p, p2 = %p", p1, p2);
instancetype == id == 万能指针 == 指向一个对象
id和instancetype除了一个在编译时不知道真实类型, 一个在编译时知道真实类型以外, 还有一个区别
注意: 以后但凡自定义构造方法, 返回值尽量使用instancetype, 不要使用id
- (instancetype)initWithAge:(int)age;
- (instancetype)initWithAge:(int)age andName:(NSString *)name;
+ (void) load {}
+ (void) initialize { }
SEL sel = @selector(setAge:);
Person *p = [Person new];
// 判断p对象中有没有实现-号开头的setAge:方法
//如果P对象实现了setAge:方法,那么就会返回YES
//如果P对象没有实现setAge:方法,那么就会返回NO
BOOL flag = [p respondsToSelector:sell];
NSLog(@"flag = %i",flag);
// respondsToSelector注意点: 如果是通过一个对象来调用该方法, 那么会判断该对象有没有实现-号开头的方法
// 如果是通过类来调用该方法, 那么会判断该类有没有实现+号开头的方法
SEL sel1 = @selector(test);
flag = [p respondsToSelector:sel1];
NSLog(@"flag = %i",flag);
flag = [Person respondsToSelector:sel1];
NSLog(@"flag = %i",flag);
SEL sel = @selector(demo);
Person *p = [Person new];
// 调用p对象中sel类型对应的方法
[p performSelector:sel1];
SEL sel1 = @selector(signalWithNumber:);
// withObject: 需要传递的参数
// 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型
// 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象
[p performSelector:sel1 withObject:@"13900000001"];
SEL sel2 = @selector(setAge:);
[p performSelector:sel2 withObject:@(5)];
NSLog(@"age = %i",p.age);
// 注意:performSelector最多只能传递2个参数
SEL sel3 = @selector(sendMessageWithNumber:andContent:);
[p performSelector:sel3 withObject:@"13900000001" withObject:@"abcdef"];
Car *c = [Car new];
SEL sel = @selector(run);
Person *p = [Person new];
[p makeObject:c andSel:sel];
Foundation => Objective-C _ Part3
标签:
原文地址:http://blog.csdn.net/purgeyhy/article/details/51255291