V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
myrual
V2EX  ›  iDev

写一个比喻来说明ios delegate,求批评。

  •  
  •   myrual ·
    myrual · 2012-03-08 09:43:22 +08:00 · 4228 次点击
    这是一个创建于 4638 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天晚上才觉得自己大概弄懂了。
    -----------------------------------------------
    有一个律师事务专门做合同审查,但是有个怪癖,从来不接受客户上门咨询。
    他们的工作方式更是奇怪,如果你要想收到合同审查的结果,那么你必须有两个邮箱 review_ok 和review_fail,然后交付合同的时候要告诉他们你们的邮箱域名是什么。
    否则只收钱干活,不给结果。
    一旦他们完成了工作,就会发送 报告到 review_ok@邮箱域名或者review_fail@邮箱域名
    比如有个小公司,叫做不挣钱有限责任公司,域名叫做 buzhengqian.com,他们和中石油要做大买卖,然后把合同发给这律师公司,然后告诉律师事务所我们的域名是 buzhengqian.com
    然后呢,等啊等啊等啊等啊, 当[email protected]收到邮件的时候,表明合同没问题,可以签字了。
    可是不挣钱公司还想问问这份合同对于中石油的海外公司是否有效,上律师网站一看,发现只要有一个叫做 oversea的邮箱就行了。
    所以还是重复上一个流程,然后呢,[email protected][email protected]都收到结果。
    不挣钱公司如果还想问问比如这份合同是否要发改委同意才能生效,查查说明, 发现只要有一个 [email protected]邮箱就行了。
    重复流程之后,发现review_fail邮箱收到了一封邮件,提示需要续费。然后发现忘了设置一个邮箱叫做 [email protected]的邮箱来回复 同意两字。
    设置好邮箱之后再重复一次,然后呢,多花了公关费100万之后 [email protected]收到邮件,题目: 没发改委什么事.
    11 条回复    1970-01-01 08:00:00 +08:00
    godwarlock
        1
    godwarlock  
       2012-03-08 10:28:22 +08:00
    隐喻的我有点儿晕

    其实就是一个用来设置回调对象的属性
    myrual
        2
    myrual  
    OP
       2012-03-08 10:46:20 +08:00
    @godwarlock 你说的没错,就是一个设置回调对象的属性。
    但是对于一个没用过mvc编程模式的人来说有点不容易习惯,我大部分时候是c语言程序员,编程的思维模式一直是控制所有的东西,而不是那种被别人控制的反向编程模式。
    其实我很想问一个问题,当在xcode里面按住ctrl把 controller连上view的时候,是不是就是xcode替我把view的delegate属性改成了controller那个类呢?
    shinyzhu
        3
    shinyzhu  
       2012-03-08 12:57:50 +08:00
    @myrual Ctrl+拖动只是创建Outlet或者Action,delegate需要明确选中delegate来拖。
    godwarlock
        4
    godwarlock  
       2012-03-08 18:03:22 +08:00
    @myrual @shinyzhu 说的没错,xib其实只是一个xml文件而已,苹果对xib进行了一套很完整的封装,载入xib时会按照文件中的属性一一创建和设置对象,不过我现在工作中都是纯代码操作,公司里用xib在合作时merge是个挺麻烦的事
    myrual
        5
    myrual  
    OP
       2012-03-08 21:41:42 +08:00
    @godwarlock 刚刚搜索了一下xib git,似乎xib用gitmerge是有一定困难的,似乎没法保证上下文的顺序?
    http://stackoverflow.com/questions/5435543/git-xibs-merging
    stranbird
        6
    stranbird  
       2012-03-08 22:23:32 +08:00
    为何不用代码来解释?

    class A
    attr_access :delegate
    def onClick
    delegate.onClick
    end
    end

    class B
    def onClick
    puts "I'm inside B"
    end
    end

    a = A.new
    b = B.new
    a.delegate = b
    a.onClick # => "I'm inside B"

    这个就是delegate的全景了。
    myrual
        7
    myrual  
    OP
       2012-03-08 22:36:05 +08:00
    @stranbird 我还在让自己适应这种设计模式的过程中,虽然明白原理,但是我需要的是那种thinking in objective c and cocoa的感觉,所以想写一些东西来强化一下记忆和理解,也正好找人讨论一下。试图通过这个过程,建立一个相对正确的ios开发逻辑。这样我可以在对某些方面不了解的情况下可以少犯错误。
    我觉得虽然说ios开发模式是mvc,但是其实是程序员请求ios展示一个view,然后通过实现view声明的delegate来做很多事情。 view活跃的那段时间其实是ios来控制的,不是程序员。
    那么程序员是处于一个被动的地位,ios处于主动地位。不知道这个理解对不对。

    另外ruby的程序确实很好懂。
    laihj
        8
    laihj  
       2012-03-08 23:12:00 +08:00
    我觉得delegate本身比楼主的比喻好懂
    stranbird
        9
    stranbird  
       2012-03-08 23:40:35 +08:00
    @myrual 我觉得你想多了。
    godwarlock
        10
    godwarlock  
       2012-03-09 00:42:12 +08:00
    @myrual 项目中的话项目文件和xib都会比较麻烦,项目文件就一个还好说,xib真的要是几个人改起来,感觉merge应该是个很折腾的事情,而且感觉xib对于代码的重复利用也没什么好处
    stranbird
        11
    stranbird  
       2012-03-09 05:05:44 +08:00
    @godwarlock 可以写xib模版,用loadNib载入,这样就可以复用了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.