——————————————————————————————
// 判断实例是否为某个类型的对象或该类型的子类的对象
/*
id sub = [MySub new];
sub = [NSObject new];
BOOL isTrue1 = [sub isKindOfClass:[MySub class]];
// 判断某个实例是否为某个类的实例对象
/*
id sub = [MySub new];
BOOL isTrue1 = [sub isMemberOfClass:[MySub class]];
// 判断类型是否为某个类的子类
// MyBase, MyClass, MySub
/*
BOOL isTrue1 = [MyClass isSubclassOfClass:[MyBase class]];
——————————————————————————————
发消息的本质
// 如果有一个对象 obj, 向这个对象发送一个消息 msg
// [obj msg]
// 怎么实现响应
// 方法响应的顺序
// 1, 首先根据 obj 所指向的内存中的 isa 找到该类型的代码区
// 2, 找该类型是否提供了 与消息名 一致的方法
// 3, 如果有这个方法, 那么就执行这个方法, 也就是响应
// 4, 如果本类型中没有这个方法, 就向父类型去找
// 5, 如果有旧调用, 如果没有再向其父类去找, 直到 NSObject
// 6, 还没有找到, 就有错误
// performSelector
// 发送消息可以使用语法 [obj msg]
// 也可以使用方法完成 [obj performSelector:@selector(msg)]
// 提供一个父类, 里面声明一个方法, 但是没有实现
// 提供一个子类, 没有声明方法, 但是实现了方法
// 结果使用 父类 *base = [子类 new];
// 然后可以使用 base 调用这个方法
// 重写方法的时候, 子类不需要声明了
// 判断这个类是否有这个方法
BOOL isTrue1 = [MyBase instancesRespondToSelector:sele];
——————————————————————————————
// 使用格式化控制字符串, %@ 的功能是专门打印对象的
// 也就是说 %@ 是一个对象类型数据的占位符
// 也就是说, 任意的一个对象都可以转换成一个字符串
// 系统在实行 %@ 的时候会自动的调用对象的 description 方法
// 因此如果需要显示出自己独有的字符串格式, 只需要重写该方法即可
// 重写 description 方法
- (NSString *)description {
return [NSString stringWithFormat:@"姓名:%@, 年龄:%d, 性别:%@", _name, _age, _gender];
}
——————————————————————————————
// NSString *str1 = @"123";
// 字面量在编译的时候, 就会编译到文件中, 在程序运行的时候
// 字面量会加载到内存中的常量区, 换句话说, 字面量不会单独开辟内存
// 空间, 来初始化一个新的字符串
// NSString *str2 = [[NSString alloc] initWithFormat:@"%d", 123];
// 首先经过 alloc 开辟内存, 清空内存
// 在执行那个构造方法, 初始化字符串
// NSLog(@"%p", str1);
// NSLog(@"%p", str2);
——————————————————————————————
——————————————————————————————
——————————————————————————————
——————————————————————————————