swift中delegate的使用注意

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》 摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。 阅读详情

swift中delegate的使用注意


原文连接:https://link.juejin.im/?target=http%3A%2F%2Fmarkmiao.com%2F2017%2F03%2F10%2Fswift%E4%B8%ADdelegate%E7%9A%84%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%2F

delegate是iOS开发中一种非常常用的设计模式,经常用作界面的反向传值。block可以做到同样的事情,曾有人言delegate是个臃肿的胖子,远不如block轻便,早该淘汰了。在ARC中,block中使用self要用weak修饰,注意循环引用。delegate也需要使用weak指针,避免内存泄露。

@property (nonatomic, weak)id<XDViewControllerDelegate> delegate;

ARC环境下在oc中定义delegate使用weak修饰,在delegate对象释放掉后,delegate没有强指针引用也会被释放掉,避免了访问不存在delegate对象的delegate方法而崩溃。可以在dealloc方法中做防御性操作:置空delegate。

- (void)dealloc {
    self.delegate = nil;
}

在最近的swift项目中用到delegate,由于没有使用weak修饰,控件循环引用无法释放,导致内存泄露。

场景是这样的: 在控制器中添加了A控件,A控件中有个子控件B,B有个代理方法,A作为他的代理,并实现了代理方法。在完成功能后,使用removeFromSuperview()移除A控件时,发现A和B的反初始化方法deinit都没调用,说明这两个控件没被释放掉,内存泄露了。

(这里有个小坑,deinit { }方法里面如果没有执行代码是不会调用的,使用deinit检测该控件是否被移除,记得在deinit { }里面写一行执行代码,比如print("deinit"))

因为我在定义delegate的时候,是这样定义的:

protocol workSelectViewDelegate {
    func addWorkBtnViewClick(workTitle: String, workColor: String)
}
class WorkSelectView: UIView{
    var delegate:workSelectViewDelegate?
}

由于delegate没有weak修饰,在移除A控件的时候,A中有B,B的代理又是A,A和B相互引用,导致谁也没能释放掉

将delegate使用weak修饰即可,直接在var delegate前面加weak,编译会报错。这是因为在swift中遵守protocol的类型有很多,其中有些类型不支持weak修饰,比如struct。这里需要限制protocol的类型遵守。比如下面指定这个protocol只能由class遵守:

protocol workSelectViewDelegate: class {
    func addWorkBtnViewClick(workTitle: String, workColor: String)
}
class WorkSelectView: UIView{
    weak var delegate:workSelectViewDelegate?
}

还有一种方式是定义oc类型的protocol,因为oc类型的protocol只有class实现。使用关键词@objc修饰protocol:

@objc protocol workSelectViewDelegate {
    func addWorkBtnViewClick(workTitle: String, workColor: String)
}
class WorkSelectView: UIView{
    weak var delegate:workSelectViewDelegate?
}

相比第二种方法,第一种方法明显才是swift该有的样子,第二种太依赖oc了。

说起依赖oc,想起来在delegate定义中的optional,在swift中定义delegate方法,如果没有可选修饰,遵守了代理而不实现代理方法,不是警告,而是直接报错。

要想使用可选实现的修饰optional,必须使用@objc修饰

@objc protocol workSelectViewDelegate{
    func addWorkBtnViewClick(workTitle: String, workColor: String)
    @objc optional func addTimeTextString()
}

这样还有一个问题,如果代理有结构体作为返回值的话,会不支持而报错。

需要另一种方法定义可选代理方法,协议拓展:

protocol workSelectViewDelegate: class{
    func addWorkBtnViewClick(workTitle: String, workColor: String)
    func addTimeTextString()
}
extension workSelectViewDelegate {
    func addTimeTextString() {

    }
}
SAP_MM_配额安排_PA认证总结 配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。 阅读详情

相关推荐

避坑指南:OpenWebUI+SearXNG联网搜索的5个常见配置错误及解决方法

本文详细解析了OpenWebUI与SearXNG整合过程中常见的5个配置错误及解决方案,包括JSON格式配置陷阱、国内搜索引擎缺失、连续搜索失效等问题。通过实战验证的优化策略,帮助开发者避免性能下降和功能异常,提升大模型与搜索引擎的协同效率。

jenkins8butler的博客 818

swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接...

  本文主要记录swift中delegate的使用、“?!”Optional的概念、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接。 一、delegate的使用 swift中delegate的使用和objective-c大同小异,简单记录一下:   step1:声明 @objc protocol testProtocol:NSObjectPr...

weixin_30616969的博客 349

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

Swift中定义protocol,定义optional方法

在swift中定义一个protocol相比objective-c来说,要更加简单,我们只需要通过一下方法就可以定义一个protocol:定义不包含optional方法的protocolprotocol XXXXXXDelegate : NSObjectProtocol { func XXXXXXX()//代理方法 }在swift中,说有的Protocol都是继承自NSObjectProtoco

CINNS的博客 2976

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2037

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

swift 中的delegate 写法

1. 声明 // this delegate needs a @objc, because @optional is only for objective-c, not for swift @objc protocol DetailViewControllerDelegate : NSObjectProtocol { optional func changeItem(forUserMode

robinson_911的专栏 2928

Dify搭建AI测试用例生成器

1、获取产品需求文档2、解读、分析、挖掘需求点,提炼为测试点3、依据测试点,生成详细的测试用例4、输出测试用例1、打开 Dify 控制台,依次点击【工作室】-【ChatFlow】-【创建空白应用】。

十二测试录 1371

Swift中的可选项(Optionals)

在实现给定值之前,考虑其是否实际上是可选的,这始终很重要——因为如果代码需要一个值才能运行,理想情况下,应该能够保证它始终存在。然而,虽然偶尔可能需要强制拆包,但它总是有导致崩溃的风险,如果其值最终丢失的话——因此,如果能找到其他解决方案,这通常是更可取的。以上是一个非常常见的模式,但它确实存在一个相当实质性的问题,因为总是必须不断将可选的子视图解包——即使它们是视图控制器逻辑的必要部分。从本质上讲,可选项提供了一种表示“值缺失”的内部方式——如果需要模拟某种形式的默认或缺失状态,可选项是的理想选择。

m0_65012566的博客 218

【DaVinci Developer专题】-8-创建一个枚举Enum ADT(Application Data Type)

目录 1 创建一个枚举Value ADT(Application Data Type) 1.1 命名application data type 1.2 创建一个computation method计算方法属性 1.3 创建一个Contraint约束条件属性 2 创建了一个新的Type Mapping Sets 3 创建了一个S/R Port Interface 4 SWC引用Type Mapping set 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录-

「汽车电子助手」的博客 2291

无线通信技术及其在机器人中的应用

本文系统阐述了无线通信技术在机器人领域的应用框架与技术选型。首先构建了无线通信的三层理论架构:物理层解决信号传输问题,链路层处理接入控制,网络层实现组网管理。随后详细分析了主流无线技术的特性与适用场景:BLE适用于低功耗传感器节点,Wi-Fi适合高带宽视频传输,5G专网满足工业AGV的广域覆盖需求,星闪技术凭借20μs超低时延和4096台并发连接能力,为高端机器人应用提供突破性解决方案。通过鄂尔多斯隆基5G专网等典型案例,验证了5G在工业AGV规模化部署中的优势,并展望了通感算智融合、星闪+5G协同等未来发

weiyvyy的博客 1114

Swift 中调用OC代理

oc @protocol EVCommonDelegate <NSObject> @optional - (void)onLoginSucceed:(EVUserInfo *_Nonnull)user; @end swift class CloudLoginVC: UIViewController, EVEngineDelegate func onLoginSucceed(...

quanhaoH的专栏 5747

如何在白平衡标定种构建不同类型的白平衡色温坐标系

以各家芯片方案的白平衡色温坐标系为切入点,详细介绍了各家芯片色温坐标系构建的理论依旧;并解析了不同色温坐标系下的物理含义,提提出了多种不同的色温坐标系

大熊 959

Swift中易导致泄露的注意事项

一、ARC 自动引用计数 Swift 使用自动引用计数 (ARC) 来跟踪并管理应用使用的内存。大部分情况下,这意味着在 Swift 语言中,内存管理自动完成,不需要自己去考虑内存管理的事情。当实例不再被使用时,ARC会自动释放这些类的实例所占用的内存。 每一个实例有引用数,每次有别的实例引用它时,引用数加一。每一次引用该实例的实例销毁时,引用数减一。等引用数等于0时,该实例被销毁。 二、循环引...

Flying 293

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OC&Swift混编的注意点

当前swift正在逐步开始流行,我们也需要与时俱进,但是在项目中又不可能已下载把所有代码进行替换,这就存在了混编的必然性。对于swift和OC的混编,我说一些自己认为需要注意的地方。 可选类型:swift中最经典的用法,需要注意的就是如果使用了!,一定不能够为nil,否则将会crash;OC转换时一般会为了简单,把成员变量的类型定义为!,那么一定要注意使用该变量时不可以为空。 相互引用:OC

iOS开发者-Ziank的总结 672

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

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

MaterialKit MKSnackbar实战:单个文件实现Snackbar提示栏+自动排队显示,附Delegate事件全流程

**MaterialKit** 是一款用 Swift 编写的 iOS Material Design 组件库,其中的 **MKSnackbar** 组件仅凭单个文件 [MKSnackbar.swift](https://link.gitcode.com/i/123abbc969249a95f83e8a437bd569b1) 就实现了完整的 Snackbar 底部提示栏:默认 3.5 秒自动消失、底

gitblog_00046的博客 67

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Delegated 3.0完全迁移教程:从旧版本到Swift 5.9新特性

Delegated是一个基于闭包的委托库,能够帮助开发者在Swift项目中实现无内存泄漏的委托模式。随着Swift 5.9的发布,Delegated 3.0带来了全新的特性和改进,本教程将详细介绍如何从旧版本顺利迁移到支持Swift 5.9新特性的Delegated 3.0版本,让你的代码更加简洁高效。 ## 一、Swift 5.9带来的新特性 Swift 5.9引入了 variadic ge

gitblog_00459的博客 454

【iOS开发基础】观察者模式

例如UITableView同时使用delegate处理用户交互,又使用数据源模式获取数据,而数据变更可以通过观察者模式通知相关视图更新。在iOS开发中,delegate是一种常见的设计模式,主要用于对象之间的通信。iOS 提供了多种方式实现观察者模式,其中 KVO(Key-Value Observing)是最常用的封装 API。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。KVO 是 iOS 原生支持的观察者模式实现,基于键值编码(KVC)机制。

m0_70834402的博客 520

LCActionSheet Block与Delegate对比:选择最适合你的回调方式

LCActionSheet是一款简约而不失强大的iOS ActionSheet组件,被微博、微信和QQ等主流应用广泛采用。在iOS开发中,处理用户交互回调是至关重要的环节,LCActionSheet提供了两种主要的回调方式:Block和Delegate。本文将为你详细解析这两种方式的差异,帮助你根据项目需求选择最合适的回调方案。 ## 📱 什么是LCActionSheet? LCAction

gitblog_01041的博客 1021

Swift中Delegate的正确使用姿势

目标 在A类里面声明一个ADelegate的代理,B类遵循并使用ADelegate定义的函数。 实现A.swift//创建协议 protocol ADelegate:NSObjectProtocol { //回调方法 传一个String类型的值 func delegateMethod(string:String) } class A: UIViewCont

陈云峰技术博客 9965

Delegate的使用方式

6.18 Delegate在使用的过程中必须要限制好使用的地方,确定所放的位置是必须使用到的,在编写自定义TextFIxed控件的过程中踩了一个深深的大坑呀。 Delegate代理模式 顾名思义就是委托别人去做事情。 分五步: 1.Delegate定义在需要委托的头文件上。格式如下: @protocol TimeDelegate NSObject> - (void)updateT

u012900383的专栏 621

XcodeSwiftSnippets网络请求片段深度解析:URLSession与Delegate模式的终极指南 [特殊字符]

在iOS开发中,网络请求是每个应用都必不可少的功能。XcodeSwiftSnippets项目为Swift开发者提供了高效实用的代码片段,特别是针对网络请求的`swift-urlsession-datatask`和`swift-urlsession-delegate`这两个核心片段。本文将深入解析这两个网络请求代码片段,帮助你快速掌握Swift网络编程的精髓。 ## 为什么选择XcodeSwift

gitblog_00049的博客 829

swift中UIScrollView的使用(图片缩放)

github学习地址:https://github.com/potato512/SYSwiftLearning 效果图 关键源码 注意事项: (1)缩放时将图片视图UIImageView的父视图设置为UIScrollView(A),然后再将UIScrollView的父视图设置为UIScrollView(B);同时设置A的delegate方法,以及设置B的conten

番薯大佬的专栏 3753

在自定义的delegate实现中注意 判断delegate有没有实现响应的@protocol方法

在自定义的delegate实现中注意 判断delegate有没有实现响应的@protocol方法       我们在自定义的delegate实现中,会判断delegate是否为空,然后如果不是为空,就调用相应的delegate的函数:     例如:      if(delegate_ != nil)     {        [delegate_    View:self

tangaowen的专栏 7248

swift5学习之旅之代理通知block的使用

swift5学习之旅----代理通知block的使用 工程文件(全是button类型的调用) Github还没上传,先用着Dropbox(可能要翻墙),看完有收获的感谢点个赞????,如果翻不了墙要代码可以私聊我 https://www.dropbox.com/sh/wbo7lwpphi8ibn9/AAAWxUOj0PRKDlTNfpPz_A11a?dl=0 dropbox代理通知block的使用 Protocol(协议)的作用: 一、定义一套公用的接口(Public) @required:必须

SCDNBB的博客 761

Swift中的protocol

在ARC中,我们通常用weak关键字来修饰delegate,在delegate的实际对象被释放时,其就会被重置为nil,有效避免循环引用。在Swift中,我们当然也希望这么做。但是当我们尝试书写这样的代码的时候,编译器就会报错: protocol TestClassDelegate {     func method() } class TestClass

YangT_T的博客 2563
上一篇: 使用objection来模块化开发iOS项目
下一篇: 使用 SDWebImage pod install 因为 libwebp 初始化不成功问题处理
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值