免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9885 | 回复: 6
打印 上一主题 下一主题

[其他] 傻了, 著名的 ios delegate 居然就是这么个东西? [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-07 15:53 |只看该作者 |倒序浏览
自: http://www.cnblogs.com/lovekarri/archive/2012/03/04/2379197.html
昨天做了一个demo,用到了简单代理。
delegate是ios编程的一种设计模式。我们可以用这个设计模式来让单继承的objective-c类表现出它父类之外类的特征。昨天这个代理实现如下:



类GifView是继承自UIView的,它加载在RootViewController上来通过一个Timer播放动画。同时,RootViewController需要知道Timer的每次执行。

代码如下。

首先,定义GifView,在其头文件中定义代理EveryFrameDelegate,同时声明方法- (void)DoSomethingEveryFrame;


#import <UIKit/UIKit.h>

@protocol EveryFrameDelegate <NSObject>

- (void)DoSomethingEveryFrame;

@end

@interface GifView : UIView
{
    NSTimer *timer;
    id <EveryFrameDelegate> delegate;
    NSInteger currentIndex;
}

@property (nonatomic, retain) id <EveryFrameDelegate> delegate;

@end

然后,只要在GifView.m中让Timer在每次执行的时候调用delegate来执行DoSomethingEveryFrame,代码如下


- (id)initWithFrameCGRect)frame
{
   
    self = [super initWithFrame:frame];
    if (self)
    {
        timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selectorselector(play) userInfo:nil repeats:YES];
        [timer fire];
    }
    return self;
}

-(void)play
{
        [delegate DoSomethingEveryFrame];

}

GifView上的工作就完成了。

下面是RootViewController中的代码,RootViewController只要在定义GifView的时候指定其代理为自身,就可以知道Timer的每次执行:


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    CGRect rect = CGRectMake(0, 0, 200, 200);
    GifView *tmp = [[GifView alloc] initWithFrame:rect];
    tmp.delegate = self;
    [self.view addSubview:tmp];
    [tmp release];
}

- (void)DoSomethingEveryFrame
{
    NSLog(@"I'm the delegate! I'm doing printing!";
}

GifView中Timer每次执行都会打印一行

I'm the delegate! I'm doing printing!

故,RootViewController就知道Timer的每次执行了。


他娘的, 这不就是 java 的所谓 interface, c++ 的抽象类, 或者说的更玄乎些, symbian 大力鼓吹的 listener 模式么?
说白了, 只不过一个约定而已, 说明, 我这个类肯定实现了签名为 xxx 的函数, 然后将对象指针塞给你

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
2 [报告]
发表于 2013-01-07 16:57 |只看该作者

delegate原本就是某些指针被阉割(从而也就木有函数指针)的语言才搞出来的玩意. C/C++本来是不肿木需要用这种模式的, 当然非要抛弃函数指针用这玩意也可以[意思就是要OOP啊OOP].
函数式编程语言中就更不需要这种玩意了.

论坛徽章:
0
3 [报告]
发表于 2013-01-07 17:00 |只看该作者
本来委托就是回调啊。

论坛徽章:
0
4 [报告]
发表于 2013-01-07 17:09 |只看该作者
说专业一点就是observer模式,
本质上其实就是一个接口, 相当于C++的抽象类,java中的interface。

我很讨厌那些发明新语言的人,更讨厌把一个旧的技术用一个看似很高深的术语来唬人的家伙.

当然,这样在一些菜鸟面前可以显得很NB。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2013-01-07 17:14 |只看该作者
都是语法糖

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
6 [报告]
发表于 2013-01-07 19:01 |只看该作者
本帖最后由 starwing83 于 2013-01-07 19:05 编辑

回复 2# captivated


    顺带说一下,静态类型+无第一类函数语言才需要delegate……(其实这个名儿就是interface/virtual class/xxxx的通俗说法……就比如说我们拿“玉米”叫玉蜀黍。然后C++er们写文章的时候都说“玉蜀黍咋地咋地”,听起来多别扭,然后有一个文学家就说“何必说的这么文绉绉的呢?我们直接说“玉米”吧,大概就是这么个情况,倒不是所谓“生造概念”)

动态类型,或者(还是并且?)有第一类函数的,都是不需要这个机制的。

事实上从C++的情况来看,template+functor就可以完全模拟virtual class了。就是这个原理。

写完了以后发现其实括号里面的才是正片啊……sigh……

再或者一下………………如果我没记错的话,.net的第一个版本出来是05/06左右那个时候吧。

如果说delegate的话,在我印象里面是.net先提出来并且在语言里面直接使用这个词儿了吧……怎么就成了“ios delegate”了呢= =

论坛徽章:
0
7 [报告]
发表于 2013-01-08 09:33 |只看该作者
本帖最后由 qinggeng 于 2013-01-08 09:39 编辑

Observer个屁呀,就是他妈的一个原始得不能再原始的实例+方法的回调函数。比C#的delegate的可扩展性差很多。
只不过在Apple的框架下,这种回调不一定是直接回调,而可能是通过异步的消息队列进行回调。
每用一次我就更加想念c++里的template+functor,或者javascript里面的function。
Apple这种delegate最大的问题就是扩展性太差。一个delegate的Instance必须实现全部的interface,虽然可以用其他一些东西绕过去,但是非常讨厌。
Apple擅长做大玩具,然后给大玩具起个装逼的名字,然后就“being cool”了。
玩具就是他妈的玩具,根本不适合严肃的工作场合。
我这两年写objc是越写越讨厌的。正准备慢慢地把objc从项目里挤压掉只剩下GUI的部分,其余的用c++实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP