Object-C-Foundation-反射
2015-06-16 09:11
567 查看
主要方法和类型
Class 变量名 = [类或者对象 class];
Class 变量名 = [类或者对象 superclass];
Class 变量名 = NSClassFromString(方法名字的字符串);
NSString *变量名 = NSStringFromClass(Class 参数);
•通过类名的字符串形式实例化对象
Class class = NSClassFromString(@"Student");
id obj = [[class alloc]init];
NSLog(@"创建的对象为: %@",obj);
将类名转换为字符串
NSString *className = NSStringFromClass(class);
NSLog(@"类名:%@",className);
对象在运行时获取其类型的能力称为内省
ObjC具有很多动态特性
而在实际使用中,使用introspection来确定该对象的实际所属类:
NSObject 提供了一些简单的查询运行时系统信息的方法:
- (BOOL)isKindOfClass:(Class)aClass
判断对象是不是属于指定类型或其子类
- (BOOL)isMemberOfClass:(Class)aClass
判断对象是不是属于指定类型
+ (BOOL)isSubclassOfClass:(Class)aClass;
判断一个类型是否是另一个类型的子类型
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
判断某个类/对象是否实现某个协议
使用@protocol封装后传入
// - (BOOL)conformsToProtocol:(Protocol *)aProtocol;
[student conformsToProtocol:@protocol(MyProtocol)];
// 或者使用类方法
// + (BOOL)conformsToProtocol:(Protocol *)protocol;
[Student conformsToProtocol:@protocol(MyProtocol)];
对象复合(composition),即对象中又包含对象,表达的时“has a”的关系;
向对象中的对象发送消息:使用嵌套的中括号,如:
[tom cardWithNumber:9999]draw:1000];
访问对象中的对象的属性,使用连续的点操作符,如:
tom.car.balance
注意:中括号和点操作符不能同时使用!!
Person *p = [[Person alloc]init];
Class c = [p class];
// NSLog(@"第一个%@",c);
Teacher *t=[[Teacher alloc]init];
c = [t class];
// NSLog(@"wo shi %@",c);
Student *tom = [[Student alloc]init];
c = [tom class];
// NSLog(@"第二个%@",c);
Student *jack = [[Student alloc]init];
Class j = [jack superclass];
NSLog(@"第三个%@",j);
if ([tom isMemberOfClass:[Person class]]) {
NSLog(@"tom is a person");
}
else{
NSLog(@"tom is not a person");
}
if ([jack isMemberOfClass:[Student class]])
{
NSLog(@"jack is a student");
}
else
{
NSLog(@"jack is not a student");
}
//测试class的反射
Class class = NSClassFromString(@"Student");
id obj = [[class alloc]init];
NSLog(@"创建的对象为: %@",obj);
NSString *className = NSStringFromClass(class);
NSLog(@"类名:%@",className);
//调用方法
//Person *p = [[Person alloc]init];
if ([p respondsToSelector:@selector(speak)]) {
[p performSelector:@selector(speak)];
}
if ([p respondsToSelector:@selector(speak)]) {
NSLog(@"speak");
}
if ([p respondsToSelector:@selector(setAge:)]) {
NSLog(@"setAge");
}
if ([p respondsToSelector:@selector(speakWith:at:)]) {
Person *p2 = [[Person alloc]init];
[p speakWith:p2 at:@"KFC"];
[p performSelector:@selector(speakWith:at:) withObject:p2 withObject:@"中餐厅"];
}
//isSubclassOfClass的使用
BOOL flag = [Person isSubclassOfClass:[Student class]];
if (flag) {
NSLog(@"yes");
}
else{
NSLog(@"no");
}
BOOL flag2 = [Student isSubclassOfClass:[Person class]];
if (flag2) {
NSLog(@"yes");
}
else
{
NSLog(@"no");
}
//判断Person类是否实现了MyProtocol协议
if ([tom conformsToProtocol:@protocol(MyProtocol)]) {
NSLog(@"tom 实现了协议");
}
Class 变量名 = [类或者对象 class];
Class 变量名 = [类或者对象 superclass];
Class 变量名 = NSClassFromString(方法名字的字符串);
NSString *变量名 = NSStringFromClass(Class 参数);
•通过类名的字符串形式实例化对象
Class class = NSClassFromString(@"Student");
id obj = [[class alloc]init];
NSLog(@"创建的对象为: %@",obj);
将类名转换为字符串
NSString *className = NSStringFromClass(class);
NSLog(@"类名:%@",className);
对象在运行时获取其类型的能力称为内省
ObjC具有很多动态特性
而在实际使用中,使用introspection来确定该对象的实际所属类:
NSObject 提供了一些简单的查询运行时系统信息的方法:
- (BOOL)isKindOfClass:(Class)aClass
判断对象是不是属于指定类型或其子类
- (BOOL)isMemberOfClass:(Class)aClass
判断对象是不是属于指定类型
+ (BOOL)isSubclassOfClass:(Class)aClass;
判断一个类型是否是另一个类型的子类型
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
判断某个类/对象是否实现某个协议
使用@protocol封装后传入
// - (BOOL)conformsToProtocol:(Protocol *)aProtocol;
[student conformsToProtocol:@protocol(MyProtocol)];
// 或者使用类方法
// + (BOOL)conformsToProtocol:(Protocol *)protocol;
[Student conformsToProtocol:@protocol(MyProtocol)];
对象复合(composition),即对象中又包含对象,表达的时“has a”的关系;
向对象中的对象发送消息:使用嵌套的中括号,如:
[tom cardWithNumber:9999]draw:1000];
访问对象中的对象的属性,使用连续的点操作符,如:
tom.car.balance
注意:中括号和点操作符不能同时使用!!
Person *p = [[Person alloc]init];
Class c = [p class];
// NSLog(@"第一个%@",c);
Teacher *t=[[Teacher alloc]init];
c = [t class];
// NSLog(@"wo shi %@",c);
Student *tom = [[Student alloc]init];
c = [tom class];
// NSLog(@"第二个%@",c);
Student *jack = [[Student alloc]init];
Class j = [jack superclass];
NSLog(@"第三个%@",j);
if ([tom isMemberOfClass:[Person class]]) {
NSLog(@"tom is a person");
}
else{
NSLog(@"tom is not a person");
}
if ([jack isMemberOfClass:[Student class]])
{
NSLog(@"jack is a student");
}
else
{
NSLog(@"jack is not a student");
}
//测试class的反射
Class class = NSClassFromString(@"Student");
id obj = [[class alloc]init];
NSLog(@"创建的对象为: %@",obj);
NSString *className = NSStringFromClass(class);
NSLog(@"类名:%@",className);
//调用方法
//Person *p = [[Person alloc]init];
if ([p respondsToSelector:@selector(speak)]) {
[p performSelector:@selector(speak)];
}
if ([p respondsToSelector:@selector(speak)]) {
NSLog(@"speak");
}
if ([p respondsToSelector:@selector(setAge:)]) {
NSLog(@"setAge");
}
if ([p respondsToSelector:@selector(speakWith:at:)]) {
Person *p2 = [[Person alloc]init];
[p speakWith:p2 at:@"KFC"];
[p performSelector:@selector(speakWith:at:) withObject:p2 withObject:@"中餐厅"];
}
//isSubclassOfClass的使用
BOOL flag = [Person isSubclassOfClass:[Student class]];
if (flag) {
NSLog(@"yes");
}
else{
NSLog(@"no");
}
BOOL flag2 = [Student isSubclassOfClass:[Person class]];
if (flag2) {
NSLog(@"yes");
}
else
{
NSLog(@"no");
}
//判断Person类是否实现了MyProtocol协议
if ([tom conformsToProtocol:@protocol(MyProtocol)]) {
NSLog(@"tom 实现了协议");
}
相关文章推荐
- Objective-C可变参数的函数实现
- j2se学习笔记-java.lang中的object类
- NSObject学习
- Objective-c 创建类的使用
- Java-Object的clone方法 protected的相关问题。
- [Object-C]iOS 形参个数可变的方法
- objective-c的成员变量:坑爹的苹果不断更新版本使得代码变化也大。
- Objective-C 关于锁的种类
- swift 和 Objective-C 互相调用
- Programming with Objective-C 学习笔记
- iPhone/iOS中保存自定义对象(Custom Object/Custom Class)的数组(NSMutableArray/NSArray)到NSUserDefaults
- object-C与JAVA和C++对比
- Objective-C Method Swizzling 的最佳实践
- JSONObject与JSONArray的使用
- objective c 类目 延展 协议
- Objective-C类成员变量深度剖析
- Objective-C Method Swizzling 的最佳实践
- 学习笔记(objective-c)-类别(category)
- 学习笔记(objective-c)-重写isEqual方法
- objective-c 键值监听