objc中的protocal 简单分析

protocal的一个主要的作用就是解耦合,分割代码实现.进行多继承###

java中有interface,objc中有protocal

    //可以看到  被代理的主体中必须要有可以找到代理的引用   然后才能调用引用(另一个类)所实现的方法
    //说白了也就是内部方法调用而已
    @protocol Matherdelegate <NSObject>
    -(void) showlogmother;
    @end

    @interface Mother : NSObject
    @property (nonatomic,assign)id<Matherdelegate> delegete;
    @end
    @implementation Mother
    @end

    @interface Father : NSObject <Matherdelegate>
    @end
    @implementation Father
    -(void)showlogmother{
        NSLog(@"delegate mother");
    };
    @end

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
           
            Mother *mother=[[Mother alloc]init];
            Father *father =[[Father alloc]init];
            mother.delegete=father;
            [mother.delegete showlogmother];
            
        }
        return 0;
    }

归根结底是底层代码的转移,就和汇编中的called指令一样,转移执行代码位置而已!但是为了可重用性(程序可以被多次调用)也为了减少耦合,将有些程序代码交给另一个地方去执行...汇编中是call子函数,protocal 执行的也是相似的功能.所以,产生了第三方代理....java中是interface,objc中是protocal...

明白了它产生的作用,这样我们在使用的时候才能更顺风顺水..

protocal在ios 的cocoa 层面运用随处可见,用来将数据和UI进行分离..比如最简单的启动代码

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@protocol UIApplicationDelegate<NSObject>

@optional

- (void)applicationDidFinishLaunching:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);

- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;

这是最开始的 appdelegate 的代码...可以看到这里实现了applicationdelegate的协议
这样的话,继承了UIresponder的app就有了处理app启动时候的能力appdelegate....当app启动之后,比如 didfinishlaunching 这个方法是如何运行的呢?

S_CLASS_AVAILABLE_IOS(2_0) @interface UIApplication : UIResponder

+(UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.");

@property(nullable, nonatomic,assign) id<UIApplicationDelegate> delegate;

我们先看uiapplication,uiapplication 是uiresponder的子类,而且这里尤其重要的是@property (....) delegate,这个就是这个application的代理,程序开始的时候,在实例化** appdelegate**和application后,当程序运行到某个触发点(tigger),比如 didfinishlaunching,会向app的delegate发送消息,而这些需要通过app持有的delegate执行的消息,其实在底层就是代码函数的跳转..所以我们一般还会将调用者传递过去...进行进一步的处理..

何时发送这个消息 一般是由使用者或者系统决定(比如按下按钮 开机等)......

Q:代理和 block 有什么取舍和异同吗?

A:

  • 代理一般比较臃肿,声明和实现进行了分开,在运行的时候,由于是别的类进行工作,一遍要传递数据和临时变量...在实现3个及以上的时候可以考虑使用代理
  • 而 block 就和回调函数(c)一样,在事件发生时就直接进行调用,方便而且代码少__.不便之处就是一个block只能在一个地方使用,代理可以一对多...只要它们都实现代理即可(通知是多对多)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Difference between shallow copy and deep copy? 浅复制和深复制的...
    用心在飞阅读 1,023评论 0 9
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,205评论 30 471
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,881评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,202评论 4 61
  • 极力的掩饰才是诗就像我只看见你就战败因为我光荣的心早已在光天化日的靶心等待万箭射穿虽然曾经好些,那时天色尚早天空含...
    竹笙煮酒阅读 291评论 0 0