delegate对调用者很友好啊

清醒疯子 发布于 2013年11月04日
无人欣赏。

1、建立协议

2、实现协议方法

3、调用协议方法

调用者只需要知道协议名称和方法结果,不用管究竟是谁实现的。很牛的样子啊:)

共19条回复
清醒疯子 回复于 2013年11月04日

只需要知道包含protocol的头文件(.h),和提供方法说明的文档,就ok了:)

zhangmeteor 回复于 2013年11月05日

最近在读一本书,尽量第一把protocol单独写成一个.h文件,其次,尽量把protocol调用放在用匿名category中。。。觉得挺在理的,分享下。

nickel 回复于 2013年11月05日

delegate其实只是一种observor观察者模式的实现而已,没什么需要惊讶的。

Sungrone 回复于 2013年11月05日

你用多了之后,再用BLOCK,就会觉得这个很麻烦了

terryso 回复于 2013年11月05日

3楼 @nickel 的确没啥好惊讶,这是iOS里最基本的东西。。。

清醒疯子 回复于 2013年11月05日

2楼 @zhangmeteor

谢谢分享:) 回头看看匿名category是什么:)category挺好用的,不破坏原类的前提下增加新功能:)

3楼 @nickel observor模式,以后看看这方面的内容:)

4楼 @Sungrone BLOCK只是看到过,以后再学习,感觉很高级的样子:)

5楼 @terryso 新手都这样:):):)

nickel 回复于 2013年11月05日

有空看看《设计模式》,码农必看的书,在入门一段时间后就该看看这本书了,但不建议刚开始做开发的时候看,没有一定经验,见过代码太少的话看了也没体会。

block其实用起来很简单,远比delegate简单,如果你写过javascript,尤其是用过jquery这类框架的话,应该会对block的模式很熟悉。只是在objc里用block还是得注意一些,尤其是要考虑block的实现者与使用者的生存期差异问题。Delegate呢其实更“优雅”一点,从设计模式的角度来讲,但block会更方便。不是什么时候都该用block来替代delegate的,例如是你需要的delegate里有比较多特性的话。

用category要注意一般不能给原类增加property的,只能增加方法。非要增加property的话有方法,但会比较麻烦,要慎用。

zhangmeteor 回复于 2013年11月05日

7楼 @nickel 匿名的category是可以的--|

nickel 回复于 2013年11月05日

8楼,你说的那种category是用在自己定义的类里的,而且通常是写在同一个.m文件里。但一般直接用category扩展别人写好的类是不可以的。

清醒疯子 回复于 2013年11月05日

7楼 @nickel 《设计模式》瞄过两眼。当时确实一点感觉都没有。摸过的代码太少,描象跟不上:)

以后也玩玩block,先把delegate玩熟:)

在看念茜的博文时,也提到这个,不要加@property :)

清醒疯子 回复于 2013年11月05日

8楼 @zhangmeteor

9楼 @nickel

为什么自己定义的类、同一.m就可以?按原则,应该一视同仁啊:) 看有文章说,加@property 会增加原类字段,改变了原类大小。这个问题,用在自己定义的类上,一样存在。只是我们没动Apple自己的类而已:)

zhangmeteor 回复于 2013年11月05日

11楼 @清醒疯子 没研究过,不过category的原理好像是nsobject类有一个指针的指针类型的list来维护方法

nickel 回复于 2013年11月05日

11楼 很简单,因为你自己的类implementation和匿名category的implementation都在同一个.m文件里,当然可以有property啦。但是如果你是扩展别人的类,类的implementation已经是写好的了,就是说类所占的空间是已经确定的,你要改变类的占用空间当然是不合法的啦。

objc之所以会有category这种不用继承就实现扩展的方式,是因为objc里所有的方法调用都是消息机制的,增加一个方法其实并不会对类结构有任何改变,只是向这个类的实例发送消息而已。但是在category里增加property是会类结构的。

另外再说说,我一般都会在任何一个我自己定义的类的.m文件里假如一个匿名category,会把所有“私有”proptery都定义在这个category里。objc本身是没有public/private这种声明的,所有在.h文件里声明的property都是可以公开的。我借用category来在.m内部声明property,这样就避免了从.h文件直接公开私有属性。

清醒疯子 回复于 2013年11月05日

13楼 @nickel

你说的是指的是在.m里这样搞吗:

@interface myClass (addProperty)
@property addProperty;
@end
@implementation myClass(addProperty)
@synthesize addProperty;
@end

@implementation myClass
@end
清醒疯子 回复于 2013年11月05日

13楼 @nickel

听你一说,觉得.h和.m有点国外房子前院后院的意思。前院(.h)是公共领域,要求很严,不能乱动。后院(.m)是私人地方,想怎么搞就怎么搞:)

清醒疯子 回复于 2013年11月05日

13楼 @nickel

增加方法不改结构,增加个property却改结构了,觉得很奇怪啊:)

nickel 回复于 2013年11月05日
@interface myClass () //Category不需要名字
@property addproperty;
@end


@implementation myClass
@synthesize addproperty; //这个东西已经不需要了,没看文档吗?sdk6.0之后就不需要了。
//bala bala bala
@end

头文件是c/c++留下来的模式,先去学习一下c吧。简单来说,c/c++/objc要提供库给他人使用时,至少需要两样东西:1)头文件,2)静态库或动态库。

清醒疯子 回复于 2013年11月05日

17楼 @nickel

原来是这样:)谢谢啊:)是没看文档,这几天都在看用户注册、登录验证类的老版 代码:)

zhangmeteor 回复于 2013年11月06日

18楼 @清醒疯子 头文件是相对公开的,所以。。能在那里少写就少写

本帖有19个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]