iOS内存话题: 弱引用下的懒加载

iOS校招笔试核心考点解析:从基础语法到内存管理与Runtime 在移动开发技术迭代加速的今天,iOS开发者不仅需要熟练使用Swift或Objective-C编写业务代码,更需深入理解底层原理,才能从容应对大厂面试与复杂工程问题。以Objective-C语言特性为基础,内存管理中的ARC与weak表机制、Runtime的消息转发与Method Swizzling、多线程编程中的GCD死锁与数据竞争,共同构成iOS进阶的核心知识体系。理解这些原理,不仅有助于破解面试中关于循环引用、KVO底层实现、block捕获变量等高频难题,更能在实际开发中指导解决内存泄漏、页面卡顿、接口 阅读详情

阅读下面的内容之前, 你应该知道什么是懒加载, 话句话说就是延时加载.

今天跟大家聊聊对于一个弱引用对象如何使用懒加载, 以及注意事项!

直接上例子.

工程比较简单, 只有一个 ViewController.

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, weak) UIButton *buton;

@end


@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    CGRect rect = CGRectMake(100, 200, 100, 50);
    self.buton.frame = rect;

    [self.view addSubview:self.buton];

    [self.buton addTarget:self
                   action:@selector(changeTheBkc:)
         forControlEvents:UIControlEventTouchUpInside];
}

- (UIButton *)buton
{
    if (nil == _buton) {
        _buton = [UIButton buttonWithType:UIButtonTypeCustom];
        [_buton setTitle:@"我是一个按钮" forState:UIControlStateNormal];
        [_buton setBackgroundColor:[UIColor blueColor]];
    }

    return _buton;
}

- (void)changeTheBkc:(id)sender
{
    UIColor *color = [UIColor redColor];
    [self.buton setBackgroundColor:color];
}
@end

大家可以看到, UIButton 对象 buton 是一个 weak 的引用.

你会说, 这个没有什么特殊的, 运行效果一定是一个按钮贴在视图上面.

就像下面这个样子.

图1

其实, 运行起来, 你会发现, 屏幕一片空白.

好了, 我们来分析一下原因吧!

改造一下 viewDidload 方法

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    CGRect rect = CGRectMake(100, 200, 100, 50);
    self.buton.frame = rect;

    NSLog(@"--------1--------sel.button: %@", _buton);

    [self.view addSubview:self.buton];

    NSLog(@"--------2--------sel.button: %@", _buton);

    [self.buton addTarget:self
                   action:@selector(changeTheBkc:)
         forControlEvents:UIControlEventTouchUpInside];

    NSLog(@"--------3--------sel.button: %@", _buton);
}

打印结果也许让你兴奋

图2

弱引用的对象, 在使用完成(懒加载的方法中, 即其 get 方法), 被系统回收了.

这个时候, 你也许想到, 把这个对象改为 strong 不就行了吗?

是的, 可以这么干.

但是, 我想说, 还有一种方式, 如果你以前经历过 MRC 的编码, 可能会很快明白其中的原理.

接下来, 我们修改一下懒加载的代码.

- (UIButton *)buton
{
    if (nil == _buton) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"按钮" forState:UIControlStateNormal];
        [btn setBackgroundColor:[UIColor blueColor]];

        [self.view addSubview:btn];

        _buton = btn;
    }

    return _buton;
}

在 viewDidload 中, 修改一下代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    CGRect rect = CGRectMake(100, 200, 100, 50);
    self.buton.frame = rect;

    NSLog(@"--------1--------sel.button: %@", _buton);

    [self.buton addTarget:self
                   action:@selector(changeTheBkc:)
         forControlEvents:UIControlEventTouchUpInside];

    NSLog(@"--------2--------sel.button: %@", _buton);
}

运行, 可以看到效果了, 一个蓝色的 UIButton 在那里 出现了.

到这里, 唯一一个疑惑就是, 这里为毛显示了~

大家, 应该注意到这句 code

[self.view addSubview:btn];

这里, 临时对象 btn 在 addSubview 的时候, 被 retain 一次, 所以赋值给 buton, 系统就不会回收了!

iOS秋招面经复盘:从简历投递到HR面的避坑指南 iOS开发不仅是搭建界面,更是对系统底层机制的深入理解。Runloop驱动事件循环,与线程协作管理页面生命周期;内存管理以ARC为核心,结合弱引用表实现自动释放。掌握这些原理,开发者才能从根源排查卡顿、崩溃等问题,构建高性能应用。在客户端岗位竞争日趋激烈的背景下,考察重点正从API使用转向底层原理、架构设计与性能优化。本文以秋招全流程复盘为线索,拆解语言基础、内存管理、并发编程、组件化等高频考点,结合简历打磨、笔试策略与心态管理,为iOS学习者提供一份可落地的求职与进阶参考。 阅读详情

相关推荐

32、深入浅出iPhone开发:构建高效且用户友好的移动应用

本文深入浅出地介绍了iPhone应用开发的核心内容,从基础环境搭建到用户界面设计、内存管理与数据持久化,再到实现复杂的用户交互。适合初学者掌握iOS开发技能,并为构建高效且用户友好的移动应用打下坚实基础。

ik67890123的博客 99

ios-弱引用

使用 __weak typeof(id) weakSelf = selfweakSelf 加入到弱引用表此时 self 引用计数为 1,weakSelf 引用计数为 2,也就是 加入弱引用表之后,是不影响引用计数的。 具体弱引用表结构的访问 StripedMap - SideTable.weak_table - weak_entries数组 - 哈希计算索引 - 目标entry 两种存储方式,按条件触发选择方式...

coding不死,也未曾凋零 1752

Objective-C 懒加载getter 生成器(开发辅助工具)

辅助开发,Objective-C 懒加载getter 生成器, 在左边贴上 property声明,点击gen,右边生成懒加载getter

iOS——weak实现原理

Weak表示弱引用,用weak修饰,描述的引用对象的计数器并不会增加,并且weak指针在引用的对象被释放时自动置为nil,可以解决循环引用问题。那么weak的具体实现原理如何呢?

chabuduoxs的博客 2573

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1636

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1263

iOS弱引用

还是重写setter通过关联对象实现弱引用,但是弱引用的实现不是通过中间对象的方式,而是通过runtime运行时重写value对象的子类的delloc方法,在这个方法中将关联对象的value设置成ni;可以看到过了b、c对象出了作用域后,a.myObject以及a.anthorObject被改成nil.背景:在面试过程中被问到如果两个对象已经发生循环引用了,该如何将他们剪断,在运行态的时候。由于这个场景比较抽象,我理解面试官是希望我通过运行时的方法和方式来解决循环引用。

685

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

iOS ------ weak的基本原理

weak的原理在底层维护了一张结构的hash表,key是所致对象的地址,value是weak指针的地址数组(weak_entry_t)如果weak指针之前指向了一个弱引用,则会调用方法,在old Obj的中移除weak_ptr地址如果weak指针需要指向一个新的引用,调用方法,将weak_ptr的地址记录到newObj对应的中对象释放时,调用函数根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

m0_73974056的博客 1755

达梦的自定义类型和存储过程支持创建同义词,不支持同义词使用?

达梦8的自定义类型和存储过程支持创建同义词,但是通过同义词调用报错,而在oracle上验证没有问题,难道是发现了达梦的bug了?非也非也,详情请见下文

wy071218的专栏 979

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 572

OC方法的懒加载

原文链接:https://www.jianshu.com/p/1c6b4887674b 提到懒加载,或许99%搞iOS开发的同学都会用过,众所周知,懒加载就是用到的时候再加载,通常我们都用作属性上面,通过self.xx来实现。那么OC方法的懒加载你听说过吗?用过吗?下面就是通过runtime来实现一下方法的懒加载,玩一下。 首先创建一个Person类,.h文件里面什么都不用写   Vi...

欢迎来到一度's博客 1447

用Navicat轻松管理魔兽世界私服数据库:修改IP、添加装备的实用技巧

本文详细介绍了如何使用Navicat管理魔兽世界私服数据库,包括修改服务器IP、添加自定义装备和调整角色属性等实用技巧。通过专业的SQL操作指南,帮助玩家轻松实现私服的高级定制,提升游戏体验。

fanta的博客 949

EatFit内存优化之道:3个页面如何支撑无限数据的复用机制

在移动端开发中,**内存优化**始终是绕不开的话题,尤其是当你需要在 iOS 上展示大量数据页面时。今天要介绍的主角 **EatFit**,正是一个把内存优化做到极致的 iOS 数据可视化组件——它受 Google Fit 启发,用 3 个常驻页面支撑起无限页面的流畅滚动,其**页面复用机制**非常值得每一位 iOS 开发者学习。 ## EatFit 是什么?🎯 EatFit 是一个基于 `

gitblog_00363的博客 624

27、物联网中的量子密钥分发:安全通信新范式

本文探讨了物联网(IoT)快速发展所带来的安全挑战,并提出量子密钥分发(QKD)作为应对新兴威胁的新范式。文章详细介绍了QKD的基础原理、BB84协议的实现流程以及其在物联网中的应用前景,同时强调了安全专业人员提升技能、制定标准化指南以及跨学科合作的重要性。通过利用量子力学特性,QKD能够提供更高的通信安全性,抵御量子计算等未来威胁,为物联网的安全发展提供保障。

tequila的博客 157

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1677

手机内存新变局:从参数比拼到系统级管理与端侧AI驱动

运行内存是手机性能的重要基础,但其价值不仅取决于容量大小,更取决于系统如何高效调度与回收资源。从LPDDR5X与UFS闪存的硬件规格,到厂商的内存融合与后台保活策略,手机内存的竞争已从参数堆砌转向系统级管理。随着端侧AI模型逐步落地,内存带宽与容量的需求被进一步放大,开发者也需要重新审视模型生命周期与内存占用。本文结合不同价位机型的内存配置,分析厂商调度差异与内存扩展技术的实际价值,并从开发者视角给出内存优化与问题排查的思路,帮助读者在选机与开发中建立清晰坐标。

weixin_34224941的博客 270

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网易2023校招移动端笔试全解析:考点分布与备考策略

移动端开发是融合操作系统、网络、数据结构与跨端框架的复合型技术领域,其校招笔试往往考察候选人的知识完整性与工程思维。理解Android生命周期、iOS内存管理、Vue响应式原理等核心概念,是构建系统化知识骨架的基础。在技术迭代与多端业务需求驱动下,移动端岗位不仅看重原生开发能力,更关注跨端方案选型与性能优化实践。针对网易2023校招移动端开发工程师笔试,本文梳理了题型分布、高频考点与编程题应对策略,并结合Vue开发框架的考察方向,提供一套可复用的备考地图。

weixin_34239592的博客 399

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

在ios中强引用与弱引用的区别

强引用也就是通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。 弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那么其还是会被清除 简单来说,strong等同retain(ARC之前),而weak和assign,weak比assign多了一个功能,当对象消失

1781

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

iOS-OC中的lazyLoad(懒加载)

懒加载(lazyLoad)又称为延迟加载,是iOS中为了节约内存常使用的方法(一个手机内存能有多大呢),简单来说,就是我们定义一个变量,在程序启动的时候不要实例化,等需要使用的时候再调用. 懒加载的有优点:占用内存小 懒加载的使用方法: 1.首先声明一个UILabel,如下: @property (nonatomic, strong)UILabel *label;

jialiOS的博客 2249

SideTable结构

iOS开发者都知道,当一个对象被释放时,所有对这个对象弱引用的指针都会释放并置为nil,那么系统是如何存储这些弱引用对象的呢?又是如何在一个对象释放时,将这些指向即将释放对象的弱引用的指针置为nil的呢?下面我们通过分析SideTable的结构来进一步了解内存管理的弱引用存储细节。 结构 在runtime中,有四个数据结构非常重要,分别是SideTables,SideTable,weak_table_t和weak_entry_t。它们和对象的引用计数,以及weak引用相关。 SideTables 下面我们

weixin_43180925的博客 3147

OC—懒加载

懒加载就是在程序启动时不去直接加载对应资源,而是在第一次调用相关方法时才去加载该资源,实际上就是对setter方法的重写,先去判断该对象是否存在,不存在才会去调用实例化该对象。即延迟加载,也叫按需加载,对于一个很长的页面,优先加载可视区域的数据,可视区域外的数据不会进行加载,其他部分等进入可视区域时再加载,这样减少了服务器的加载,提高用户体验,避免浪费性能。懒加载的优点:不需要将创建对象的代码全部写在viewDidLoad中,提高了代码的可读性。

2501_91546205的博客 403

关于iOS的强引用,弱引用及strong,retain,copy,weak,assignd

初学者干货:     一、强引用和弱引用:        OC中的内存管理是通过“引用计数器”来实现的。        一个对象的生命周期取决于它是否还被其他对象引用(是否retainCount=0)。但在有些情况下,我们并不希望对象的销毁时间由是否被其他对象引用来决定,而是这个对象本该是什么时候销毁就什么时候被销毁。这时,我们得引入“强引用”和“弱引用”的概念。         强引

MyHaloJ 656

Spring Boot嵌入式Tomcat源码解析:自动装配与启动流程揭秘

Java Web应用部署时,传统外置容器与嵌入式容器的选型直接影响环境一致性与运维效率。Spring Boot将Servlet容器内嵌进应用进程,通过自动配置机制按条件装配Tomcat、Jetty或Undertow,使应用产物自带Web服务器,极大简化了部署流程。其内部由ServletWebServerFactoryAutoConfiguration完成工厂选择,在容器刷新阶段的onRefresh钩子中创建并启动Tomcat,再通过TomcatStarter将DispatcherServlet等组件注册进S

diaoju3333的博客 398

强引用与弱引用探讨

保留一个对象创建了一个对该对象的“强”引用。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。 弱引用在可能会出现循环引用的情况下是必不可少的。例如,如果对象A和...

mrjeye's blog 272

c++ 引用

转载博客:http://blog.youkuaiyun.com/cy_weiyi/article/details/46851555 如: int &ref = num; 就是ref是一个int型的引用。 引用有什么作用呢? 看下面代码就知道了: 1 #include <iostream> 2 3 using namespace std; 4...

weixin_30679823的博客 196
上一篇: Cocoapods: 打造本地 pod 库
下一篇: iOS AutoLayout: 关联 Xib 和 UIViewController
veryitman
博客等级 码龄16年 472粉丝 310原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值