ios 协议代理

1,oc类:

返回值类型用()包住,也可不声明返回值,编译器会自动添加一个id类型的返

回值。因此不推荐不写返回值,如果没有直接写(void

       参数定义:方法名字后面继续加:符号,表示参数。同样是()包住类型后面写变量名称,如果有多个,则依次书写即可。

- (返回值类型)方法名字:(变量类型变量名字 标签1:(变量类型变量1名字;

2,委托代理:既为某对象处理特定的事情的类

//h文件
#import <Foundation/Foundation.h>
@class Button;

// <>代表实现某个协议
@protocol ButtonDelegate <NSObject>
- (void)onClick:(Button *)btn;
@end


@interface Button : NSObject

// delegate就是按钮的监听器
@property (nonatomic, retain) id<ButtonDelegate> delegate;

// 点击按钮
- (void)click;
@end
//m文件
#import "Button.h"

@implementation Button


- (void)dealloc {
    [_delegate release];
    
    [super dealloc];
}

- (void)click {
    // 如果_delegate实现了onClick:这个方法
    if ( [_delegate respondsToSelector:@selector(onClick:)] ) {
        // 按钮被点击了,就应该通知监听器.并且告诉监听器哪个按钮被点击了
        [_delegate onClick:self];
    } else {
        NSLog(@"监听器并没有实现onClick:方法");
    }
}
@end
//h文件
#import <Foundation/Foundation.h>

@protocol ButtonDelegate;

@interface MyListener : NSObject <ButtonDelegate>

@end
//m文件
#import "MyListener.h"
#import "Button.h"

@implementation MyListener
- (void)onClick {
    NSLog(@"MyListener已经监听到按钮被点击了");
}

- (void)onClick:(Button *)btn {
    NSLog(@"MyListener已经监听到按钮-%@被点击了", btn);
}
@end
//main文件
#import <Foundation/Foundation.h>
#import "Button.h"
#import "ButtonListener.h"
#import "MyListener.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        // 初始化一个按钮
        Button *button = [[[Button alloc] init] autorelease];
        MyListener *listener = [[[MyListener alloc] init] autorelease];
        
        // 设置按钮的监听器
        button.delegate = listener;
        NSLog(@"button:%@", button);
        // 点击按钮
        [button click];
        
        Button *button2 = [[[Button alloc] init] autorelease];
        button2.delegate = listener;
        NSLog(@"button2:%@", button2);
        // 点击button2
        [button2 click];
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wangzh1225/p/3418880.html