zoukankan      html  css  js  c++  java
  • objective-c 协议(Protocol)和代理(Delegate)

    协议的基本概念

    协议的声明看起来比较类似一个类的接口,不同的是协议没有父类也不能定义实例变量。协议是一种特殊的程序设计结构,用于声明专门被别的类实现的方法,协议在以下场合非常有用:

    需要由别的类实现的方法

    声明未知类的接口

    两个类之间的通信

    协议的基本特点

    协议可以被任何类实现的方法

    协议本身不是类,它使定义了一个其他类可实现的接口

    类目也可以采用协议

    协议中的关键字

    @required:表示必须强制实现的方法

    @optional:表示可以有选择性的方法

     

     

    代理设计模式的基本概念

    通俗来讲,代理就让别人替自己完成一件事情

    代理是指一个对象提供机会对另一个对象中的行为发生变化时做出的反应。

    代理设计模式的基本思想——两个对象协调解决问题,通常用于对象之间的通信。

    代理设计模式的基本特点

    简化了对象的行为,最小化了对象之间的耦合度

    使用代理,一般来说无需子类化

    简化了我们应用程序开发,既容易实现,又灵活

     

     

     

    示例代码:

    夏目现在想买一台mac,可是她现在有事情,不能去经销商那里购买,所以让经销商帮他找看看还有mac的存货没

    FindComputer.h

    #import <Foundation/Foundation.h>
    
    @protocol FindComputer <NSObject>
    
    -(void)findcomputer;
    
    @end

    Person.h

    #import <Foundation/Foundation.h>
    #import "FindComputer.h"
    
    @interface Person : NSObject
    
    @property(nonatomic,assign)id<FindComputer>newdelegate;//此处声明一个代理,从而Person可以让代理人完成需要代理的事情
    @property(nonatomic,copy)NSString *name;
    
    -(id)initWithName:(NSString *)name withDelegate:(id)delegate;//传入代理
    -(void)wantbuyMac;//被代理的事情
    
    
    @end

    Person.m

    #import "Person.h"
    @implementation Person
    
    -(id)initWithName:(NSString *)name withDelegate:(id)delegate{
        if (self = [super init]) {
            _name = name;
            _newdelegate = delegate;
        }
        return self;
    }
    
    -(void)wantbuyMac{
        [_newdelegate findcomputer];
        
    }
    @end

    Dealer.h

    #import <Foundation/Foundation.h>
    #import "FindComputer.h"
    @interface Dealer : NSObject<FindComputer>
    
    
    @end

    Dealer.m

    #import "Dealer.h"
    
    @implementation Dealer
    
    -(void)findcomputer{
        NSLog(@"找见了你需要的mac");
    }
    
    @end

    main.m

    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Dealer.h"
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            // insert code here...
            NSLog(@"Hello, World!");
            
            Dealer *dealer = [[Dealer alloc]init];
            Person *person = [[Person alloc]initWithName:@"夏目" withDelegate:dealer];
            [person wantbuyMac];
    
            
        }
        return 0;
    }

     

  • 相关阅读:
    iPhone UIButton图标与文字间距设置【转】
    UIButton左边图片右边文字的做法
    UICollectionViewCell设置阴影
    ARC中__bridge, __bridge__transfer, __bridge_retained 关系
    NSFileHandle的用法(用于读写文件)
    自定义FrameWork
    IOS7 适配以及向下兼容问题
    IOS 7 UITableView cell lines不能靠左解决方法
    xml报错“cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element”
    《Effective Java》笔记 :(一)创建和销毁对象
  • 原文地址:https://www.cnblogs.com/mo-shou/p/3500476.html
Copyright © 2011-2022 走看看