• OC @protocol(声明协议 )


    @protocol Study;
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            Student *stu = [[[Student alloc] init] autorelease];
            
            // 注意:OC是弱语法的,对类型要求不严格
            // NSString *stu = [[[Student alloc] init] autorelease];
            // [stu stringByAbbreviatingWithTildeInPath];
            
            // conformsToProtocol:判断是否遵守了某个协议
            if ([stu conformsToProtocol:@protocol(Study)]) {
                NSLog(@"Student遵守了Study这个协议");
            }
            
            // respondsToSelector:判断是否实现了某个方法
            if ( ![stu respondsToSelector:@selector(test)] ) {
                NSLog(@"Student没有实现test这个方法");
            }
        }
        return 0;
    }
    #import <Foundation/Foundation.h>
    
    @protocol Study <NSObject>
    // 默认就是@required
    - (void)test3;
    
    // @required表示必须实现的方法
    // 虽然字面上说是必须实现,但是编译器并不强求某个类进行实现
    @required
    - (void)test;
    
    - (void)test1;
    
    // @optional表示可选(可实现也可不实现)
    @optional
    - (void)test2;
    @end

     

    #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
    #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

    调用

    #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];
            
            // 初始化一个按钮的监听器
    //        ButtonListener *listener = [[[ButtonListener 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;
    }
  • 相关阅读:
    关于Jupyter Notebook默认起始目录设置无效的解决方法
    关于二叉树中度为0与度为2节点数关系证明
    LeetCode第[3]题(Java):Longest Substring Without Repeating Characters 标签:Linked List
    数据结构,物理结构,存储结构,逻辑结构的区分
    条件变量 sync.Cond
    defer 的常用场景
    switch...case... 语句中的类型转换
    golang 切片和数组在for...range中的区别
    golang 并发顺序输出数字
    Golang 中哪些值是不可以寻址的
  • 原文地址:https://www.cnblogs.com/liuwj/p/6899946.html
Copyright © 2020-2023  润新知