NSMapTable:类似字典
NSPointerArray:类似数组
NSHashTable:类似于集合的集合,和NSSet相似
设计思路的话也比较简单,就是使用一个中间类,去遵守各种协议,然后当有对象需要遵守协议的时候,只需要将对象注册到中间类中,只要委托方调用了协议方法,那么代理方法实现的地方就会走相应的方法。
protocols:NSMapTable:协议存储表【Key:协议的遵守者 Value:代理】,就是存的:哪些遵守者 遵守了哪个协议
targets:NSPointerArray:协议的遵守者
首先会定义一个单例【KGDelegate shareInstance】
1,-addTarget: withProtocol:
先判断protocols中存储的有没有targets,如果有targets但是没有包含这个target,就把当前这个target和对应的协议添加到protocols中,如果没有targets,直接创建个targets,然后把当前这个target和对应的协议添加到protocols中【self.protocols setObject : targets forKey:protocol】
2,-respondsToSelector:判断遵守者能不能响应方法
3,-methodSignatureForSelector:方法签名,慢速转发
4,-forwardInvocation:消息转发,判断target能不能执行该方法,如果能 就invokeWithTarget:target去执行方法
其他还可以进行移除协议代理,移除遵守者
使用:
【KGDelegate shareInstance】addTarget:self withProtocol:NSProtocolFromString(@" 需要遵循的代理的名字 ")
在iOS中直接调用某个对象的消息方式有两种:
1,performSelector:WithObject:
2,NSInvocation
NSInvocation;用来包装方法和对应的对象,它可以存储方法的名称,对应的对象,对应的参数,
//创建签名对象的时候不是使用NSMethodSignature这个类创建,而是方法属于谁就用谁来创建NSMethodSignature*signature=[ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithNumber:WithContent:)];
//1、创建NSInvocation对象
NSInvocation*invocation=[NSInvocation invocationWithMethodSignature:signature];
invocation.selector=@selector(sendMessageWithNumber:WithContent:);
invocation.target=self;
NSString*number=@"1111";
[invocation setArgument:&number atIndex:2];/*第一个参数:需要给指定方法传递的值
第一个参数需要接收一个指针,也就是传递值的时候需要传递地址*///第二个参数:需要给指定方法的第几个参数传值
[invocation invoke]; // [invocation invokeWithTarget:target]; 指定target去执行某个方法
网友评论