一个UI控件弱引用问题

Interface编程实现 Gobject是单根继承的对象系统,但是通过interface也可以实现多继承。interface类似于C++中的抽象类,不能实例化但可以用来继承,类似U盘和移动硬盘,虽然本质上有所区别,但是它们的接口都是USB接口。并且只要它们插到计算机上,主机不关心那个东西是U盘还是移动硬盘,它只需要知道对方是个USB设备就可以了。这样,我们不需要在计算机主机中单独为U盘创造一种U盘接口,也不需要单独为移动硬 阅读详情

今天学习的过程中看到如下代码:


@interface ViewController ()
@property (weak,nonatomic) UIButton *buttonA;
@property (weak,nonatomic) UIButton *buttonB;
@property (strong,nonatomic) UILabel *theLabel;

- (void)initInterface;
- (void)updateInterface;
- (void)handleButton:(id)sender;
@end


@implementation ViewController
<p class="p1"><span class="s1">- (</span><span class="s2">void</span><span class="s1">)initInterface {</span></p><p class="p2"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> =[</span><span class="s5">UIButton</span><span class="s3"> </span><span class="s1">buttonWithType</span><span class="s3">:</span><span class="s1">UIButtonTypeRoundedRect</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> </span><span class="s1">addTarget</span><span class="s3">:</span><span class="s2">self</span><span class="s3"> </span><span class="s1">action</span><span class="s3">:</span><span class="s2">@selector</span><span class="s3">(handleButton:) </span><span class="s1">forControlEvents</span><span class="s3">:</span><span class="s1">UIControlEventTouchDown</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonA</span><span class="s3"> </span><span class="s1">setTitle</span><span class="s3">:</span><span class="s6">@"Button A"</span><span class="s3"> </span><span class="s1">forState</span><span class="s3">:</span><span class="s1">UIControlStateNormal</span><span class="s3">];</span></p><p class="p3"><span class="s1">    </span></p><p class="p2"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> =[</span><span class="s5">UIButton</span><span class="s3"> </span><span class="s1">buttonWithType</span><span class="s3">:</span><span class="s1">UIButtonTypeRoundedRect</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> </span><span class="s1">addTarget</span><span class="s3">:</span><span class="s2">self</span><span class="s3"> </span><span class="s1">action</span><span class="s3">:</span><span class="s2">@selector</span><span class="s3">(handleButton:) </span><span class="s1">forControlEvents</span><span class="s3">:</span><span class="s1">UIControlEventTouchDown</span><span class="s3">];</span></p><p class="p2"><span class="s3">    [</span><span class="s2">self</span><span class="s3">.</span><span class="s4">buttonB</span><span class="s3"> </span><span class="s1">setTitle</span><span class="s3">:</span><span class="s6">@"Button B"</span><span class="s3"> </span><span class="s1">forState</span><span class="s3">:</span><span class="s1">UIControlStateNormal</span><span class="s3">];</span></p><p class="p3"><span class="s1">    </span></p><p class="p1"><span class="s1">    </span><span class="s2">self</span><span class="s1">.</span><span class="s4">theLabel</span><span class="s1">=[</span><span class="s5">UILabel</span><span class="s1"> </span><span class="s7">new</span><span class="s1">];</span></p><p class="p4"><span class="s3">    </span><span class="s2">self</span><span class="s3">.</span><span class="s4">theLabel</span><span class="s3">.</span><span class="s5">text</span><span class="s3">=</span><span class="s1">@"Welcome"</span><span class="s3">;</span></p><p class="p5"><span class="s3">    [</span><span class="s2">self</span><span class="s3"> </span><span class="s1">updateInterface</span><span class="s3">];</span></p><p class="p1"><span class="s1">}</span></p>

@end


同是UI控件,作者将button设为weak的,而label却是strong的,在updateInterface方法中我们看到button和label都被初始化,可为什么一个是strong另一个却是weak呢?

仔细观察initInterface方法我们发现他们使用的初始化方法是不同的,button用的是buttonWithType方法,而label用的是new方法。

先来说label,因为new方法分配的对象必须被一个指针强引用,否则在执行完这句代码后对象就 会因为没有被强引用而释放掉,因此label必须是强类型的。那button是弱类型的话难道对象不会被释放吗?问题就出在这个buttonWithType方法上。

根据ARC规则,所有非alloc/new/copy等开头的方法返回的对象都是autorelease的(参见点击打开链接 ),因此buttonWithType方法返回一个autorelease对象,即使不被任何对象所强引用,它也不会立即释放,而是要等runloop结束后才释放。因此

self.buttonA =[UIButton buttonWithType:UIButtonTypeRoundedRect];
之后self.buttonA指向的内存依然存在,使用没有问题。

【为什么控件的引用和控件的代理要用weak Objective-C语言】 阅读详情

相关推荐

Android面试必问:Handler、Bitmap,Android开发中常见的一些问题面试专题

这份PDF囊括了JVM,Java集合,Java多线程并发,Java基础,生命周期,微服务, 进程,Parcelable 接口,IPC,屏幕适配,线程异步,ART,架构,Jetpack,NDK开发,计算机网络基础,类加载器,Android 开源库源码分析,设计模式汇总,Gradle 知识点汇总…主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。

2401_84002482的博客 831

界面的初始化

//初始化界面 void InitInterface() { color(6); //颜色设置为土黄色 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (j == 0 || j == COL - 1) { face[i][j] = WALL; //标记该位置为墙 CursorJump(2 * j, i); printf("■"); } else if...

weixin_68305376的博客 290

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1108

go入门笔记五(init函数&方法、interface&闭包函数)

java设计模式(外观模式)

hkduan的博客 374

基于任务的功能磁共振成像的连接性分析

虽然这种方法通过减少偶然只选择特异性代表的可能性来改善可推广性,但类别内和类别间的变异性变得更难控制(例如,"鸟类"可能是一个比"车辆"更加/不那么同质的类别),并且可能会出现关于这些预定义类别是否是现实世界实体的有意义划分的担忧——尽管这个限制在某种程度上可以通过表征相似性分析来解决。特别是,海马单变量激活和语义认知区域(左下额回)中语义信息的表征强度之间的交互预测了项目的概念记忆,而海马单变量激活和视觉处理区域(腹内侧枕叶皮层)中视觉属性的表征强度之间的交互预测了图像样本的知觉记忆。

cc1609130201的博客 2231

ChatGPT Plus账号被降智?3个实用检测方法+终极解决方案(附国内支付指南)

本文针对ChatGPT Plus账号性能下降问题,提供了3个科学检测方法和系统级解决方案。通过详细分析症状、专业诊断技巧和优化策略,帮助用户有效应对GPT-4o等高级功能失效、响应质量下降等问题,特别包含国内用户关心的支付方案和账号管理建议。

weixin_42639633的博客 472

Java interface 接口的使用理解

很多人都比较疑惑,为什么要使用接口。 在我个人理解来说,接口其实是一套协议,一套契约,是框架开发者与使用者之间的一种契约,框架开发者/架构师承诺,只要你符合我的契约,也就是实现接口那么我必然可以支持你的拓展类。当框架设计者认为这一个类需要被灵活的拓展用于适应需求,在提供一个默认的解决方案的同时,提出了这种契约,以便使用者拓展。可以看看下面的例子,就比较容易理解,接口定义的意义。框架设计者允许使用者

张少飞的优快云 1120

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1570

iOS_UIKit视图控件用weak修饰原因

当UI控件添加到父控件以后(如:图片控件imageView;代码:[self.view  addSubview:imageView]),父控件的subView数组会强指针指向这个视图控件;所以定义这个控件属性变量用弱指针weak修饰就行,从而防止内存泄露。

u013076979的博客 595

【应用】OpenClaw玩转有道云笔记

功能名称核心原理实操示例(直接复制可用)实操避坑+补充说明网页剪藏插件自动抓取网页正文、下载图片,通过 API 发送到你的有道云笔记,内联图片避免防盗链失效帮我把这个网页剪藏到云笔记:https://example.com/article1. 避坑:知乎、公众号等需登录的网站,先在浏览器登录再剪藏;2. 原理:自动过滤广告,只留正文;3. Twitter/X 剪藏需额外配置 APIFY_API_TOKEN(见1.2.4)创建笔记。

海兰 714

LangChain .NET:C#开发者构建AI应用的RAG框架与实战指南

大语言模型(LLM)作为当前人工智能的核心技术,通过深度学习海量文本数据,掌握了强大的语言理解和生成能力。其原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系,从而实现对复杂语义的建模。这一技术价值在于能够将非结构化的自然语言转化为可计算、可推理的表示,为各类智能应用提供认知基础。在实际工程实践中,LLM常被应用于构建检索增强生成(RAG)系统和AI智能体(Agent)。RAG通过结合外部知识库检索与LLM生成,有效提升了问答的准确性和事实性,是构建企业知识库、智能客服等场景的关键技术。

weixin_42538175的博客 705

问题

UIView被NavigationBar挡住: self.navigationController.view.addSubview()

SunghaJung_的博客 353

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 143

iOS 【UIKit-属性中引用UI控件要用weak的原因】

当UI控件添加到父控件中以后,父控件的subViews数组会有强指针指向这个对象,就可以保证这个对象不会被销毁,在搞一个属性引用这个对象,用弱引用就可以。这样在UI控件对象从其父控件移除时指向他的弱指针也会释放。(如果用强指针,那么指向控件的内存空间不会被释放,那么就会内存泄露)

CoderZYWang 1619

用 XCO 库一键找出某个 ABAP 类的全部子类

ABAP XCO库子类枚举技术解析 本文介绍了在ABAP项目中如何利用XCO库高效获取类的继承层次结构。传统方法使用CL_ABAP_CLASSDESCR或手动维护映射表存在效率低、易遗漏的问题。新方法通过XCO库的IF_XCO_AO_CLASS接口,可简洁地获取父类的所有子类(包括间接子类)。 核心API链式调用: 获取类句柄:xco_cp_abap=>class() 导航子类集合:subclasses->all 获取结果:get()返回类引用表或get_names()返回类名列表 典型应用场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UI控件为什么要用weak

首先纠正一下标题, 不应该叫UI控件, 而是通过xib直接拖拽的UI控件(@property (weak, nonatomic) IBOutlet UIButton *testBtn;). 对于新学习的同学可能不太容易理解week属性, 误以为, week是为了解决循环引用的而使用的, 而事实上, 通过xib拖拽的控件属性, 系统自动使用week修饰, 不是为了解决循环引用问题的. 这个应该很好...

王俊岭的博客 1248

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

探讨声明UI控件属性 什么时候用weak什么时候用strong

也许我们在学习的时候,有人会告诉我们,UI控件的属性用weak修饰,而且,从Storyboard中拖出来的控件也都是用weak来修饰的,所以在习惯上,我们总会用weak去修饰。然而,在某些情况下,这么做是会出问题的,这时我们必须用strong来修饰。探讨之前,首先要了解Objective C的内存管理机制,即引用计数。 一个对象何时会被释放呢?答案是,当引用计数为0的时候。 建立一个UIView,声

Se7en丶潇洒哥 的博客 4632

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

什么时候用强引用,什么时候用弱引用

什么时候用强引用,什么时候用弱引用 小结:       1.NSString 和 block  用copy       2.基本数据类型用assgin       3.对象都用strong       4.UI控件和代理 用weak

sinat_34194127的博客 1130

QNetworkAccessManager异步请求有时候操作UI控件崩溃问题

但是当请求的返回有延迟时,我们关闭这个子窗口后,响应才返回,槽函数才调用,此时去更新控件,控件已经被析构了,就会抛访问冲突的异常,程序崩溃

sc_o_r_pio的博客 300

python弱引用_何时在Python中使用弱引用?

事件是弱引用的常见场景。问题考虑一对对象:发射器和接收器。接收器的寿命比发射器短。您可以尝试这样的实现:class Emitter(object):def __init__(self):self.listeners = set()def emit(self):for listener in self.listeners:# Notifylistener('hello')class Receiver...

weixin_32589453的博客 356

推荐开源项目:WeakEvent - 强大的弱引用事件解决方案

推荐开源项目:WeakEvent - 强大的弱引用事件解决方案 在.NET应用程序开发中,事件经常成为内存泄漏的根源,因为发布者通过委托保持对订阅者的强引用,防止了订阅者被垃圾回收。为了解决这一问题,我们向您推荐一款名为WeakEvent的开源库,它提供了一种优雅的方式,使得您可以在不影响订阅者生命周期的情况下发布事件。 项目介绍 WeakEvent是一个小巧而强大的.NET库,由开发者Thoma...

gitblog_00015的博客 391

OnSharedPreferenceChangeListener调用失败之坑 强引用 软引用 弱引用 虚引用之分

OnSharedPreferenceChangeListener,监听也会失效哦。 强引用,软引用,弱引用,虚引用之分。

fengyucoder的博客 640

ios UI控件引用用weak,UI控件代理属性必须用weak

在Objective-C的ARC模式中, 1 id obj1 = [[NSObject alloc] init]; 这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即: 1 id obj1 =

chengjiamei的专栏 1229

Handler之倒计时【解决内存泄漏要用弱引用吖】

方式1 不考虑内存泄漏 public class CountDownTimeActivity extends AppCompatActivity { public static final int COUNT_TIME_CODE = 1001; public static final int DELAY_MILLIS = 2000; public static final int MAX_COUNT = 10; private TextView textView;

qq_37687466的博客 274

Android性能优化总结为一下几点和软引用、弱引用详解

Android性能优化总结为一下几点: 1.数据库优化: 2.对界面UI进行优化 3.代码优化 4.控件优化,比如ListView 5.对Bitmap内存优化 6.使用软引用和弱引用 Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚

qigemizi的博客 575
上一篇: ARC实践
下一篇: Objective-C Runtime Programming Guide 中文翻译
syd_programming
博客等级 码龄22年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值