关于cocoa编程模块间协作的一点总结(delegate/T-A/notification/...)

2024-03-28 22:18

本文主要是介绍关于cocoa编程模块间协作的一点总结(delegate/T-A/notification/...),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在cocoa编程中,我们经常会遇到delegate、Target-Action、notification等等这些方法,我觉得从某种角度看,可以将这些方法总结在一起,它们就是为不同模块间提供协作的方法,这种协作在这里我把它理解为是“回调”,其实 "回调"二字在这里更多是借用,并没有认真地去考究过这些正是一堆回调函数,纯粹是觉得挺像,感觉用来说明问题挺方便,所以就借用一下,应用层我们常见的"回调"就有以下几类:

第一:当然是如雷贯耳的delegate,这个没什么好说的,教程和文档说得够权威仔细了,它主要在"父子"实例中会常被用到;

第二:这种方式比较常见,但却未必会想到它其实也可以理解为是一种“回调”,这就是Target-Action模式;

第三:最任劳任怨的NSNotificationCenter,它以你最舒服的方式提供很令你满意的服务,它有三个关键词比较重要,observer、sender和name,observer就是notification的接受者,在"注册method"中会碰到它,经常是self,我也建议是这样,自己的notification就应该自己去注册,sender在设置"发送method"中(postNotificationName:object:和postNotificationName:object:userInfo:)的object参数时会见到,这个参数非常重要,它直接影响对NSNotificationCenter 使用的质量,sender是什么意思,就是notification的"签名",当在注册method中我们可以指定仅接受哪个sender的notification,那么center就是靠"发送method"时的object这个参数所传的"签名"来决定怎么发的,name比较简单,相当于标题,observer可以而且必须指定接受哪些name的notification,不同name其含义自然不同,在关系比较远的模块间,NSNotificationCenter很实用;

第四:KVO(Key-Value Observing),这个用得比较少,当B模块对A模块的属性状态感兴趣时,可以使用这种方法,参考文档:Key-Value Observing Quick Start;

第五:一个例子就明白了,它其实就是直接将一个对象的指针和方法作为参数传给另一个对像,让另一个对象来调用自己,就是这一句:
UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
#pragma mark -
#pragma mark UIImagePickerController delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)Info {    
    
    UIImage *originalImage = [Info objectForKey:UIImagePickerControllerOriginalImage];
    if(nil != originalImage)
    {
         UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
       
        ...
    
}

- (void) image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    ...
}

以上就是我的一点小小的总结,这些方法在模块间的协作可能会经常使用到的,希望对开始学习cocoa的人们有点帮助吧。

转自:http://www.cnblogs.com/Win-Iphone_QG/archive/2011/02/16.html

大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。

通过上面那段话我们已经了解委托的基本原理,用大白话讲就是:你的老板想要做个项目,于是老板把任务交给了项目经理,可是项目经理却把写代码的事情让你去做了,这个过程其实就是 项目经理.delegate = 程序员,那么假如项目经理有了一个oCCoding()任务要程序员做,那么程序员这个类中就要实现oCCoding()这个方法。

我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。
1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)
2.所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)
3.利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。

最后,我想分享一下在使用委托的时候的一些心得和注意事项。

心得:delegate的命名要准确,尽量看名字就知道用法。delegate和通知有的用法有些象,但是前者是单对单的,后者是单对多的情况。
注意:在dealloc要把delegate至为nil,还有就是delegate设置属性的时候要用assign,不要用retain。

这篇关于关于cocoa编程模块间协作的一点总结(delegate/T-A/notification/...)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856838

相关文章

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链