• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

objective-c 协议与委托

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

委托(delegate)是一种对象,另一个类的对象会要求委托对象执行它的某些操作。
创建一个“NSObject”类别称为创建一个非正式协议
任何实现“NSObject”类别中的方法的类的对象都可以成为委托对象。因为在Objective-C中所有的
类都是NSObject的子类。
当你想要向委托对象发送消息时,最好先检查该对象是否理解你将要发送的消息。
if ([delegate respondsToSelector: @selector(...)]
{
  [delegate ...];
}
正式协议:通过在@protocol部分列出一组方法名来定义一个正式协议。通过在@interface声明中的类名之后列出
用尖括号括起来的协议名称,对象可以采用协议。当对象采用一个协议时,它承诺实现该协议中列出的每一个要求
实现的方法。如果你没有实现,编译器会提出警告,从而帮助你履行承诺。
当你使用了某个协议时,最好显示的声明,而不仅仅是实现了协议的方法(虽然可以这么做)。
下面这个例子中,没有声明采用协议FooDelegate,而只是实现了协议方法-(void)fun。这样虽然也能工作,
但这不是一个好的编程习惯。(应把Temp的声明改为@interface Temp:NSObject<FooDelegate>)
应该始终在类声明时指明我们使用的协议,这能明确表达我们的意图。这也是为什么要有正式协议的原因,否则
非正式协议就满足了。

/**********************************************
                                         Foo.h
***********************************************/
#import <Foundation/Foundation.h>

@interface Foo : NSObject
{    
    NSInteger _t;
}

@property NSInteger t;
@property (nonatomic, strong) id delegate;
-(void) notify;
@end

@protocol FooDelegate

-(void)fun;

@end

/**********************************************
                                         Foo.m
***********************************************/
#import "Foo.h"

@implementation Foo
@synthesize delegate;

-(void)setT:(NSInteger)newt
{    
    self.t = newt;
}
-(NSInteger)t
{
    NSLog(@"getter");
    return self.t;
}

-(void) notify
{
    NSLog(@"notify...");
    if ([delegate respondsToSelector:@selector(fun)])
    {
        [delegate fun];
    }
}
@end

/**********************************************
                                         Temp.h
***********************************************/

#import <Foundation/Foundation.h>

@interface Temp : NSObject

@end

/**********************************************
                                         Temp.m
***********************************************/

#import "Temp.h"
@implementation Temp

-(void) fun
{
    NSLog(@"Temp fun");
}

@end

/**********************************************
                                         main.m
***********************************************/

#import <Foundation/Foundation.h>
#import "Foo.h"
#import "Temp.h"

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

    @autoreleasepool {
        
        
        Foo *ob = [[Foo alloc] init];
        Temp *t = [[Temp alloc] init];
        ob.delegate = t;
        [ob notify];        
    }
   
    return 0;
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Objective-C字符串处理的函数发布时间:2022-07-12
下一篇:
C++模拟实现Objective-C协议和代理模式发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap