您的位置:首页 > 移动开发 > IOS开发

iOS 动态类型isKindOfClass, isMemberOfClass

2015-07-22 10:45 211 查看
对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。

这些知识是看别的博主写的,然后自己理解再写一遍。

新建两个类,Person,Teacher。Teacher继承与Person。

1.Person类

[objc] view
plaincopy

//

// Person.h

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;

-(void)setName:(NSString *)name;

@end

[objc] view
plaincopy

//

// Person.m

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import "Person.h"

@implementation Person

-(void)setName:(NSString *)name{

self.name = name;

}

@end

2.新建Teacher类

[objc] view
plaincopy

//

// Teacher.h

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import "Person.h"

@interface Teacher : Person

-(void)teach;

@end

[objc] view
plaincopy

//

// Teacher.m

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import "Teacher.h"

@implementation Teacher

-(void)teach{

NSLog(@"我是教数学的");

}

@end

3.Students类

[objc] view
plaincopy

//

// Students.h

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface Students : NSObject

-(void)learning;

@end

[objc] view
plaincopy

//

// Students.m

// iOS动态类型

//

// Created by 987trip_dev_mac on 15/6/16.

// Copyright (c) 2015年 987trip_dev_mac. All rights reserved.

//

#import "Students.h"

@implementation Students

-(void)learning{

NSLog(@"我是学生,我爱学习");

}

@end

在控制器上实例化

[objc] view
plaincopy

/**

Person,Teacher这两个类。Teacher是继承与Person。

*/

Person *person = [[Person alloc]init];

Teacher *teacher = [[Teacher alloc]init];

判断对象类类型

- (BOOL)isKindOfClass:(Class)aClass;isKindOfClass是检测属不属于这个类的子类。就算是继承都是可以检测出来

- (BOOL)isMemberOfClass:(Class)aClass;isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。

[objc] view
plaincopy

/**

Person,Teacher这两个类。Teacher是继承与Person。

*/

Person *person = [[Person alloc]init];

Teacher *teacher = [[Teacher alloc]init];

//isMemberOfClass方法。

if ([teacher isMemberOfClass:[Teacher class]]) {

NSLog(@"teacher Teacher类的成员");

}

if ([teacher isMemberOfClass:[Person class]]) {

NSLog(@"teacher Person类的成员");

}

if ([teacher isMemberOfClass:[NSObject class]]) {

NSLog(@"teacher NSObject类的成员");

}

//只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。

//isKindOfClass方法

if ([teacher isKindOfClass:[Teacher class]]) {

NSLog(@"teacher 是 Teacher类或Teacher的子类");

}

if ([teacher isKindOfClass:[Person class]]) {

NSLog(@"teacher 是 Person类或Person的子类");

}

if ([teacher isKindOfClass:[NSObject class]]) {

NSLog(@"teacher 是 NSObject类或NSObject的子类");

}

// isKindOfClass 是检测属不属于这个类的子类。就算是继承都是可以检测出来

判断实例是否有这个方法

- (BOOL)respondsToSelector:(SEL)aSelector;判断实例是否有这样方法

[objc] view
plaincopy

if ([person respondsToSelector:@selector(setName:)]==YES) {

NSLog(@"Person 有这个方法 setName");

}

if ([Teacher respondsToSelector:@selector(alloc)]==YES) {

NSLog(@"Teacher 有这个方法 alloc");

}

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;判断类是否有这个方法。此方法是类方法,不能用在类的对象

[objc] view
plaincopy

if ([Person instancesRespondToSelector:@selector(teach)]==YES) {

NSLog(@"Person 有这个方法 ");

}

if ([Teacher instancesRespondToSelector:@selector(teach)]==YES) {

NSLog(@"Teacher 有这个teach方法");

}

if ([Teacher instancesRespondToSelector:@selector(setName:)]==YES) {

NSLog(@"Teacher 有这个setName方法");

}

1. NSClassFromString

  这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;

  优点:

1, 弱化连接,因此并不会把没有的Framework也link到程序中。

2,不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

[objc] view
plaincopy

//动态加载实例

//NSClassFromString(<#NSString *aClassName#>)

//这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;

id student = [[NSClassFromString(@"Students") alloc]init];

if ([student isMemberOfClass:[NSClassFromString(@"Students") class]]) {

NSLog(@"存在 Students 这个类");

}

//等价于

id students = [[Students alloc]init]

NSSelectorFromString

 这个方法是上个方法的补充,也是动态加载实例方法。

[objc] view
plaincopy

//动态加载实例的方法

SEL sel = NSSelectorFromString(@"learning");

if ([student respondsToSelector:sel]) {

[student performSelector:sel withObject:student];

NSLog(@"存在这个方法");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: