ios delegate你必须知道的事情

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化 演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。 阅读详情
ios delegate你必须知道的事情 

转:http://popcornylu.blogspot.com/2011/07/delegate.html 

当你开始写iOS程式不久,应该开始面对到很多的delegate, 
不管是用别人的library或是自己写library,可能都逃不了delegate。 
为了怕有些人不知道什么是delegate,在这边简单的介绍一下, 
delegate中文叫做委托,通常会用在class内部把一些事件处理"委托"给别人去完成。 
举个例子,XML Parser可能他知道怎么parse xml,但是parse到的东西要怎么处理xml parser可能不知道。 
所以NSXMLParser就提供了一个NSXMLParserDelegate给client去实作, 
当parse到某个element的时候,就callback delegate所定义的message, 
让他client自己去决定怎么去处理这个element。 
好吧,我承认我解释的很模糊,不过我这篇本来就不是要你搞懂什么是delegate, 
而是针对使用或是设计delegate的时候,可能会要注意的事情。 

在我们的class中设计delegate的时候,我们通常会有几个注意事项。 
假设我的class叫做MyClass,那我们可能会有定义一个MyClassDelegate这个protocol当作我的delegate protocol。 
而MyClass中我们可能是这样写。 
@protocol MyClassDelegate <NSObject> 
- (void) myClassOnSomeEvent:(MyClass*)myClass; 
@end 

@interface MyClass 
{ 
    id<MyClassDelegate> _delegate; 
} 
@property (nonatomic, assign) delegate; 
@end 
上面的code我们注意到delegate此property是定义为@property (assign)。 
为什么我们不用retain而要用assign呢? 
原因就是在于iOS的reference counting的环境中,我们必须解决circular count的问题。 
让我们来写写我们平常都怎么用delegate的,下面的code我想大家应该不陌生 
- (void)someAction 
{ 
   myClass = [MyClass new]; 
   myClass.delegate = self; 
   .... 
} 
这边很快的就出现circular reference了 
假设上面的code是写在一个myViewController的物件当中, 
之后一旦myViewController的reference count变成1的时候, 
myViewController跟myClass这两个兄弟两只剩下互相retain,那就变成了孤岛,也​​就因此造成了memory leak!!! 
 

也因为这样,iOS官方文件才会要建议我们所以的delegate都要用assign property。 
也就是所谓"weak reference"的property,他的特色就是虽然会持有对方的reference,但是不会增加retain count。 
如此下来,当myViewController的retain count变成0,则会dealloc。 
同时在dealloc中,也一并把myClass release,则myClass也跟着被release。 
- (void)dealloc 
{ 
   [myClass release]; 
   [super dealloc]; 
} 

 

事情就结束了吗? 还没有唷... 
这边还有一个大家常常忘记的重点,那就是上面的dealloc这样写会有潜在危险。 
应该要改成这样 
- (void)dealloc 
{ 
   myClass.delegate = nil; 
   [myClass release]; 
   [super dealloc]; 
} 
你可能会很纳闷,myClass不是马上就会被release了吗? 干嘛要先把他的delegate设成nil? 
那是因为我们假设myClass会马上会被dealloc,但是现实状况这个是不一定的, 
有可能里面内部有建个NSURLConnection,或是正在做某件事情而让其他物件也retain myClass。 
如果myClass没有马上dealloc,那他的myClass.delegate不就正指向一个不合法的位置了吗? (此种pointer称作dangling pointer) 

 

解决方法是在MyViewController的dealloc中,在release myClass之前, 
要先把原本指向自己的delegate改设成nil,这样才可以避免crash发生。 
在我之前写的project,很大一部份的crash都是这样造成的,因为这个问题通常不是每次都发生, 
但是发生的时候确很难在重新复制,所以不可不慎啊。 

 

但是很兴奋的是到了iOS5中的Automatic Reference Counting 这个问题可以有所改善。 
在ARC中提出了一个新的weak reference的概念来取代原本的assign, 
weak reference指到的物件若是已经因retain count归零而dealloc了,则此weak reference也自动设成nil。 
而原本​​旧的这种assign的作法,在ARC中叫做__unsafe_unretained,这只是为了相容iOS4以下的版本。 

回顾重点: 
如果你是写library给别人用的,记得把你的delegate设成assign property,这样才不会造成circular reference 
当你是要始用别人的library,记得在你自己dealloc的时候,把delegate设成nil,以避免crash的事情发生。 

References 
解决‘GLIBC_2.28 not found‘错误:手把手教你升级glibc到最新版(附中文乱码修复) 本文提供了一份详尽的Linux系统glibc升级实战指南,旨在解决常见的'GLIBC_2.28 not found'错误。文章不仅涵盖从风险评估、环境准备到编译安装的完整流程,还特别加入了精简本地化数据以修复中文乱码的实用技巧,帮助管理员和开发者在安全可控的前提下完成系统核心库的升级。 阅读详情

相关推荐

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 682

the cause of the delegate why use assign

delegate使用方法: @property (assign) xxxDelegate delegate; 正确的使用方法是使用assign属性而不是retain。援引stackoverflow查到的东西: "The assign keyword will generate a setter which assigns the value to the instance var

jasmhotmail1698的专栏 462

【 Git学习记录(三)】推荐四款主流的Git代码托管平台 —— GitHub、GitLab、Gitee、Coding

了解过Git之后,作为一个程序猿最基本的,你还需要了解目前主流的在线代码托管平台,并至少选择其中一款在平时开发中使用。这里特别介绍以下四款: 国外平台 GitHub —— 全球最流行的代码托管平台 GitLab —— 基于git的仓库管理程序 国内平台 Gitee —— 开源中国旗下的代码托管平台 Coding —— 支持社交元素的代码托管平台 一. GitHub 链接地址:https://github.com/ GitHub目前是全球最流行的代码托管平台(别称:全球最大的同性交友.

JZevin的博客 6090

delegate为什么用assign声明

类的设计模式 类与类只见的大体关系有继承和聚合的关系,当我们使用聚合的时候该对象就拥有聚合的对象,这时候我们就需要retain使引用计数器+1来控制该对象的内存管理,所以我的感觉retain和copy的一项能力就是拥有该对象的内存管理权。 下面就得说delegate了,一个对象没必要管理自己delegate的生命周期,或者说没必要拥有该对象,所以我们只要知道它的指针就可以了,用指针找到对象去调

yaohenduohenduojifen的博客 797

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章

Python浙大版PTA题解

wzhh_的博客 5526

delegate weak与assign

公司的代码,声明delegate时都用的assign,与自己一惯使用的weak不同,故查了一下区别,随笔 weak:该对象不负责持有delegate,delegate的销毁由外部控制(指向一个对象,但不拥有该对象) strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用. assign:指针赋值,不增加引用计数,但是使用之后如果没有置为nil,可能就会产...

weixin_30446613的博客 244

国内外主流嵌入式GUI汇总

随着MCU资源增多,处理能力也强了,同时市场需求也增多了GUI功能也越来越丰富了,很多的嵌入式图形库都可以做出绚丽的界面。

m0_69914734的博客 3289

iOS 代理(Delegate)

一、代理的特点 准确的说是一种软件设计模式 iOS当中以@protocol形式提现 传递方式一对一 二、代理的基本使用 代理是一种通用的设计模式,在iOS中有特定的语法来实现代理模式,OC语言可以通过@Protocol实现协议。 1、代理组成部分 协议:用来指定代理双方可以做什么,必须做什么。 代理:根据协议,完成委托方需要实现的功能(方法)。 委托:根据协议,指定代理去完成什么功能。 2、协议(Protocol)的概念 从上图中我们可以看到三方之间的关系,在实际应用中通过协议来规定代理双方的行为

xiaoxiaobukuang的专栏 3960

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 202

【深度学习】什么是自回归模型?

自回归模型是一种重要的时间序列模型,通过利用过去的值来预测当前或未来的值。它在统计学、经济学、自然语言处理等领域有广泛的应用。自回归模型的简单性和可解释性使其成为许多应用的首选,但在更复杂的情况下,可能需要结合其他模型如移动平均模型(MA模型)或混合模型(如ARIMA)来更好地捕捉时间序列中的模式。扩散模型(Diffusion Model)和自回归模型(Autoregressive Model)是两种不同的生成模型,各自有独特的特点和应用场景。

q742971636的博客 1670

ios delegate你必須知道的事情

转载自:http://my.oschina.net/dingbuoyi/blog/69928 你開始寫iOS程式不久,應該開始面對到很多的delegate,  不管是用別人的library或是自己寫library,可能都逃不了delegate。  為了怕有些人不知道什麼是delegate,在這邊簡單的介紹一下,  delegate中文叫做委託,通常會用在class內部把一些事件處理

沸腾的泪水的专栏 911

2026年AI视频生成大模型全景指南:国内外主流工具深度对比与选型建议

AI视频生成技术在2025年至2026年间取得了突破性进展,从"能用"进化到"好用",商业化应用加速落地。中美双轨竞争格局基本成型,国内模型在技术追赶和本土化体验方面展现出强劲竞争力。对于用户而言,选择合适的AI视频生成工具需要综合考虑技术性能、使用门槛、成本预算和具体需求。零基础新手推荐海艺AI、通义万相等低门槛工具;进阶创作者可根据需求选择可灵AI、即梦AI、海艺AI等;专业开发者和企业用户可考虑智谱清影的开源能力或可灵AI的商业化服务。

nmdbbzcl的博客 2839

CH592蓝牙MCU集成方案与低功耗HID开发实战指南

在物联网设备开发中,单芯片蓝牙MCU正逐步取代“主控MCU+蓝牙透传模块”的传统组合,成为低功耗无线产品的主流选择。其核心价值在于将BLE协议栈、射频收发器与应用处理器集成于一体,通过事件驱动调度实现深度睡眠与快速唤醒,从而大幅降低平均工作电流。对于采用纽扣电池供电的蓝牙键盘、遥控器等HID外设而言,这种集成方案既能简化硬件设计,又能灵活配置连接参数和报告描述符,是实现长续航和稳定连接的关键技术路径。本文围绕CH592这颗典型蓝牙MCU,从硬件最小系统、射频布局到TMOS低功耗调度、HID服务配置,系统梳理

weixin_34175509的博客 340

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Docker多阶段构建实战:镜像瘦身与构建优化全解

在容器化交付中,Docker镜像体积直接影响传输效率、存储成本与安全风险。传统单阶段Dockerfile将构建工具链与运行环境混为一体,导致镜像动辄数GB,且包含大量无关漏洞组件。多阶段构建通过在同一Dockerfile中声明多个FROM,实现构建与运行环境分离,仅将必要产物复制到最终镜像,从机制上解决镜像膨胀问题。结合BuildKit缓存挂载、分层复制等技巧,可显著加速CI/CD流水线;配合Alpine、Distroless等精简基础镜像,以及非root用户、只读文件系统等加固手段,能够打造兼顾体积与安全

weixin_34417183的博客 175

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于IOS中的delegate必须知道的事情

当你开始写iOS程式不久,应该开始面对到很多的delegate,不管是用别人的library或是自己写library,可能都逃不了delegate。为了怕有些人不知道什么是delegate,在这边简单的介绍一下,delegate中文叫做委托,通常会用在class内部把一些事件处理"委托"给别人去完成。举个例子,XML Parser可能他知道怎么parse xml,但是parse到的东西要怎...

weixin_33719619的博客 92

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

iOS中的delegate的用法和规范

Objective-C中的delegatedelegate是Objective-C编写的应用中各种对象之间互相调用的主要方式之一. 通常情况下, 对象可以接收的消息都通过在接口文件中声明的方法来表示.@protocol MyProtocol <NSObject> - (void)func; @end什么是delegatedelegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委

晓月的专栏 3万+

关于 iOS delegate 的遐想

关于iOS 中,delegate 的两种玩法。

j_akill的专栏 730

[iOS]delegate和protocol

自己的实例: 两个类,a 和 b 多见于自视图或者下一级视图数据发生变化但是要改变的是上一级视图的内容的情况 1, 首先在b中声明这个protocol @protocol ViewControllerDelegate <NSObject>@optional- (void)hideSubViews;- (void)showSubViews;@end @interfa...

135

iOS笔记-----关于回调函数——Delegate的那些事

iOS笔记也终于迈入两位数之列。在此里程碑下。明显要拿出点诚意来好好写一写。所以,我决定写一下早已改写的delegate。 什么是回调函数 我们先不管delegate,我们先来说说回调函数(callback).wiki的解释在这里。 回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。 好我来说所自己理解过后的解释: 如果不用回调函数可不可以写程序。(

仰望星空 3943

IOS delegate

ios delegate你必须知道的事情 转:http://popcornylu.blogspot.com/2011/07/delegate.html 当你开始写iOS程式不久,应该开始面对到很多的delegate, 不管是用别人的library或是自己写library,可能都逃不了delegate。 为了怕有些人不知道什么是delegate,在这边简单的介绍一下, d

lx923988898的专栏 794

iOS中delegate、protocol的关系

刚开始接触iOS,对delegate、category、protocol这几个概念比较模糊。参考了一些资料,记录下来体会。         1.protocol         protocol和interface的概念类似,是object-c语法的一部分。protocol就是一系列不属于任何类的方法的列表。其中声明的方法能被任何类实现。只在protocol中定义行为,在不同的

3330
上一篇: ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)
下一篇: iOS开发之Objective-C与JavaScript交互操作
qtcreatorlinux
博客等级 码龄15年 17粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值