明天要去面试一个公司,今天复习下IOS题目吧

1.说一下OC的反射机制

答:OC的反射机制类似于JAVA的反射机制,这种动态反射机制可以让OC语言更加灵活。这句话是对反射机制的初步认识,具体表现在哪里使得他类似JAVA的反射机制,又如何让OC语言更加的灵活呢?可以通过一些代码去更好的理解。总的来说,OC的反射机制主要有三个用途:

1.获得CLASS

2.检查继承关系

3.动态调用方法

先来说说第一个用途,获得class的具体用法:

#import "Person.h"

//1.通过字符串来获取class

Class classname = NSClassFromString("Persong");

NSLog(@"%@", className);

//2.直接使用Class来创建,一般情况下我们都使用这种方法

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

NSLog(@"%@", person);

//然后通过实例对象去获取Class .[person class]方法

NSLog(@"%@", [person class]);

//3.通过类来获得Class

NSLog(@"Person.Class = %@", [Person class])

再来说说第二个用途,也就是检查继承关系

//NSObject提供了一些方法可供一般对象直接调用(继承与NSObject)。

//1.通过对象,来判断该对象的Class也就是[对象 class]方法;

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

SLog(@"[person class] =  %@", [person class]);

//2.去判断某个对象是否为某个类的实例对象isMemberOfClass:Person

NSLog(@"person是否是Person的实例对象:%d", [person isMemberOfClass:Person.class]);

//3.判断某个实例对象是否为某个类及其子类的实例isKindOfClass

NSLog(@"[person isKindOfClass:[person class]] = %d ", [person isKindOfClass:[person class]]);

//3.判断某个实例是否实现了指定的协议

NSLog(@"%d", [person conformsToProtocol:@protocol(UITableViewDelegate)]);

最后说说第三个用途,动态调用方法

//此处希望调用remove方法

// (1)使用 performSelector: withObject: 动态的调用move:方法(消息传递)

[self performSelector:@selector(move:) withObject:@2];

[self performSelector:NSSelectorFromString(@"move:") withObject:@10];

// (2)使用objc_msgSend 进行实现方法(为某个类对象发送消息,并返回一个值。参数1,2分别是接收消息的实例对象,要执行的方法)

objc_msgSend(self, @selector(move:), @4);

objc_msgSend(self, @selector(test:andNum:), @1, @2);

05-06 07:19