强引用(strong)\弱引用(weak)\unsafe_unretained的区别

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析 本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。 阅读详情
两个属性:
@property (nonatomic, strong) NSString *string1; 
@property (nonatomic, strong) NSString *string2;

self.string1 = @"String 1"; 
self.string2 = self.string1;
self.string1 = nil; 
NSLog(@"String 2 = %@", self.string2); 

结果是:String 2 = String 1
由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

接着我们来看weak关键字:

如果这样声明两个属性:

@property (nonatomic, strong) NSString *string1; 
@property (nonatomic, weak) NSString *string2; 

输出结果是:String 2 = null
分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。

接着我们来看unsafe_unretained
什么是unsafe呢,下面看实例。
如果这样声明两个属性:
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, unsafe_unretained) NSString *string2;
再来猜一下,下面的代码会有什么结果?
请注意,在此我并没有叫你猜会有什么输出,因为根本不会有输出,你的程序会crash掉。

原因是什么,其实就是野指针造成的,所以野指针是可怕的。为何会造成野指针呢?由于用unsafe_unretained声明的指针,由于self.string1=nil已将内存释放掉了,但是string2并不知道已被释放了,所以是野指针。然后访问野指针的内存就造成crash.  所以尽量少用unsafe_unretained关键字。

strong,weak, unsafe_unretained往往都是用来声明属性的,如果想声明临时变量就得用__strong,  __weak, __unsafe_unretained,  __autoreleasing, 其用法与上面介绍的类似。

还是看看实例吧。

  1. __strong NSString *yourString = @"Your String";   
  2. __weak  NSString *myString = yourString;   
  3. yourString = nil;   
  4. __unsafe_unretained NSString *theirString = myString;  
  5. //现在所有的指针都为nil  

再看一个:

  1. __strong NSString *yourString = @"Your String";   
  2. __weak  NSString *myString = yourString;   
  3. __unsafe_unretained NSString *theirString = myString;  
  4. yourString = nil;   
  5. //现在yourString与myString的指针都为nil,而theirString不为nil,但是是野指针。  

__autoreleasing的用法介绍:

在c/c++,objective-c内存管理中有一条是:谁分配谁释放。 __autoreleasing则可以使对像延迟释放。比如你想传一个未初始化地对像引用到一个方法当中,在此方法中实始化此对像,那么这种情况将是__autoreleasing表演的时候。看个示例:

  1. - (void) generateErrorInVariable:(__autoreleasing NSError **)paramError{   
  2.     NSArray *objects = [[NSArray alloc] initWithObjects:@"A simple error", nil];  
  3.     NSArray *keys = [[NSArray alloc] initWithObjects:NSLocalizedDescriptionKey, nil];  
  4.     NSDictionary *errorDictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];  
  5.     *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary];  
  6. }  
  7. -(void)test  
  8. {  
  9.     NSError *error = nil;   
  10.     [self generateErrorInVariable:&error];  
  11.     NSLog(@"Error = %@", error);  
  12. }  

这样即便在函数内部申请的空间,在函数外部也可以使用,同样也适合谁分配谁释放的原则。

同样下面的代码也是类似原因, 只不过在没有开启ARC的情况下适用:

  1. -(NSString *)stringTest  
  2. {  
  3.     NSString *retStr = [NSString stringWithString:@"test"];  
  4.       
  5.     return [[retStr retain] autorelease];  
  6. }  

开启ARC后,应改为:
  1. -(NSString *)stringTest  
  2. {  
  3.     __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"];  
  4.       
  5.     return retStr;  
  6. }  



【ComfyUI】Wan2.2 Animate 背景保留动作迁移视频生成 本文介绍了一个基于ComfyUI的高精度视频生成工作流"Wan2.2 Animate",该系统融合动作捕捉、图像拼接和LoRA加权等技术,能自动识别人脸并完成精准动作迁移,同时保持背景稳定。工作流采用模块化设计,包含输入提取、图像融合、模型加载等关键节点,核心模型Wan2.2-Animate-14B支持fp8精度与BlockSwap控制。流程分为图像输入、动作提取、多图合成等五个阶段,通过文本提示编码器和图像语义编码器实现语义驱动的动作生成,最终输出高质量视频,适用于虚拟形象驱动和 阅读详情

相关推荐

PredFormer实战:用Transformer搞定交通流量预测(附TaxiBJ数据集代码)

本文详细介绍了如何利用PredFormer这一基于Transformer的先进模型进行交通流量预测,特别针对TaxiBJ数据集提供了完整的实战代码和优化策略。PredFormer通过门控Transformer块(GTB)的创新设计,在时空预测任务中展现出显著优势,相比传统方法将MSE降低33.1%,推理速度提升4.4倍。文章还涵盖了模型轻量化、部署优化等实用技巧,为智慧城市建设中的交通预测提供了高效解决方案。

weixin_29194817的博客 445

__weak & __unsafe_unretained的用法以及区别

转载自:   http://www.jianshu.com/p/df0269e0d3c3 __unsafe_unretained: 不会对对象进行retain,当对象销毁时,会依然指向之前的内存空间(野指针) __weak: 不会对对象进行retain,当对象销毁时,会自动指向nil 代码示例 #import #import "Person.h"

沸腾的泪水的专栏 5321

MatLab Desired port was :31515解决方案

前言:使用的MatLabR2022b今天突然出现了错误,在程序中打不开文件。后尝试了下面的方法,可以解决。后面还有另一种方法,上面方法如果行不通,大家可以尝试一下。搜索栏输入:firewall.cpl。找到相关项,右键属性,设置为允许。

qq_42212501的博客 1339

__strong、__weak 与 __unsafe_unretained区别

__strong 在arc环境中默认行为,对对象进行retain。 举例 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSObject *obj = [[NSObject alloc] init]; //默认指针被__strong修饰,等价于:__st...

weixin_33831196的博客 233

RS485/CAN总线防护电路设计:TVS选型与ESD防护实战解析

本文深入解析了RS485与CAN总线防护电路设计中的TVS选型与ESD防护实战技巧。针对工业现场常见的静电放电、浪涌等干扰,文章详细阐述了TVS管关键参数的选择、多级防护体系的构建,并特别强调了在隔离电路设计中地回路处理的重要性,帮助工程师设计出更可靠的通信接口。

metaverse5vr的博客 386

Vivado实战:AXI转PCIe IP核配置全流程(含性能优化技巧)

本文详细介绍了在Vivado环境中配置AXI转PCIe IP核的全流程,包括工程准备、IP核参数设置、BAR空间配置、中断系统优化以及TLP传输效率提升等关键步骤。特别分享了经过验证的性能优化技巧,帮助开发者显著提升PCIe链路的吞吐量和稳定性,适用于视频采集、高速数据记录等应用场景。

weixin_30892037的博客 552

ARC中strong、weak、unsafe_unretained的区别

第一、strong关键字与retain关似,用了它,引用计数自动+1 如果person定义如下: @interface Person : NSObject @property(nonatomic,strong)Book *book1; @end @autoreleasepool { p1=[[Person alloc] init]; Book *book

richard_如风的专栏 2565

保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG)

本文详细解析了FD-SOI工艺流程中的三大关键技术:外延生长、应变硅工程和HKMG集成。通过选择性外延生长技术优化接触电阻,利用应变硅提升载流子迁移率,并结合先栅高k金属栅工艺实现精准栅极控制,FD-SOI技术在智能手机处理器和自动驾驶芯片制造中展现出卓越的低功耗与高性能平衡。

weixin_29267307的博客 490

strong, weak, unsafe_unretained.属性解释

关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似)。在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序员非常受用。 strong关键字与retain关似,用了它,

damon2989的专栏 529

SAP 公司间采购简介

SAP公司间采购(Intercompany Procurement)是指企业集团内部不同法人实体之间的采购和销售流程。这种流程在跨国公司或有多个独立运营子公司的企业中非常常见。SAP提供了标准的功能来处理公司间采购,确保财务和物流流程的透明性和效率。以下是SAP公司间采购的基本流程及其相关模块的简介。

我小时候很黑的博客 1378

EMB电子机械制动系统和EHB电子液压制动系统控制功能的对比

EMB电子机械制动系统相比EHB液压制动系统具有显著优势:响应速度更快(<100ms)、控制精度更高(±2N·m)、能实现单轮独立控制,支持0.1%级制动力调节。在ABS、ESC等安全功能上表现更优,制动平顺性和NVH性能更好,同时提升能量回收效率15%-20%。特别适合智能驾驶需求,可使AEB等系统响应时间缩短50ms,紧急制动距离减少1米以上。EMB系统完美契合高阶自动驾驶对快速响应和精准控制的要求。

m0_59012156的博客 885

JAVA中引用类型——强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)

1、强引用(Strong Reference) People p=new People(); 经常使用的创建一个对象就是强引用。如果对象是一个强引用,JVM绝对不会回收,如果内存满了则抛出OutOfMemoryError异常 2、软引用 源码,构造器 public class SoftReference<T> extends Reference<T> { public SoftReference(T referent) { super(referen

weixin_42182892的博客 392

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 669

ObjC 基础-属性关键字(atomic、nonatomic、retain、strong、copy、assign、unsafe_unretained、weak)的区别与用法

iOS 开发 atomic、nonatomic、retain、strong、copy、assign、unsafe_unretained、weak,属性关键字的区别是什么? 为什么经常用copy来修饰Block属性,而不用strong weak 弱指针的底层实现原理是什么?怎么办到一旦指向的对象被销毁,弱引用(指针)会被置为nil? assign修饰对象属性,为什么会产生野指针?

fanshengle的博客 914

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

iOS开发中的ARC内存管理机制(2)——强引用与弱引用

归零弱引用(Zeroing Weak Reference)

痴_Pro的博客 694

蓝牙模块HM-10手册

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

iOS 属性修饰符的区别

前言 iOS5 之前 所有的 开发都需要开发者自己控制自己的对象的引用和释放。使用的修饰符是 assign、copy、retain iOS5 之后,Apple 推出了ARC(自动引用计数)机制,推出了新的修饰符替代之前的修饰符 strong、weak简单说明 1:ARC环境下,strong代替retain.weak代替assign 2:weak的作用:在ARC环境下,,所有指向这个对象的w

iOS_HC的博客 3463

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

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

iOS5的strong,weak,unsafe_unretained ARC自动管理内存

一、iOS5的strong,weak,unsafe_unretained 原文链接http://blog.youkuaiyun.com/sillyboytao/article/details/7664847 1.简单讲strong等同retain; weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻。 2.iOS5中加入了新知识,就是ARC,其实我并不是

苹果园 3068

iOS面试题整理---属性[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomic]...

readwrite 编译器会自动生成setter/getter方法; 可以读、写; readwrite是默认的; readonly 声明你的属性是只读的,并且告诉编译器不用自动生成setter方法; 当你尝试给一个readonly的属性赋值时,会Xcode提示错误。 copy 在iOS开发中,一般copy关键字用在NSString、NSArray、NSDict...

weixin_30561425的博客 235

property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存。但是学习还是很有必要的。 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章。 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习st

caizhongtao的专栏 2592

__weak、__strong这样的关键词和weak、strong有哪些区别

ios4 设备上最好就不要使用 ARC。。。 strong,weak 用来修饰属性。 strong 用来修饰强引用的属性; @property (strong) SomeClass * aObject; 对应原来的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;

7256

iOS property参数:weak、strong、nonatomic、retain、assign等的用法

1.@property有哪些参数? 第一组: 内存管理特性 retainassigncopystrongweak unsafe_unretained autoreleasing 第二组: 读 /写特性 readwritereadonly 第三组: 多线程特性 nonatomicatomic 第四组: 方法名特性 settergetter 2.参数有何作用(参数说明) 第一组(retainassigncopy...

az44yao的专栏 461

io strong,weak ,__unsafe_unretained, __autoreleasing

strong,weak 用来修饰属性。 strong 用来修饰强引用的属性; @property (strong) SomeClass * aObject;  对应原来的  @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;  weak 用来修饰弱引用的属性; @prop

taoshuai567的专栏 717

iOS内存管理:strong,weak,retain,assign

strong与weak是由ARC新引入的对象变量属性 xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用strong与weak。 strong:叫强引用,在ARC中使用strong告诉编译器帮助我们自动插入retain。 weak:叫弱引用,在ARC

Sean6139的博客 548

iOS 之 Strong与Weak,_unsafe _unretained与weak区别

1. 在ARC中 strong(强引用) 相当于retain, weak(弱引用) 相当于assign。ARC下,strong告诉编译器自动插入retain。但是在ARC下,代理协议的属性依然用assign,防止循环引用。 2. _unsafe_unretained与weak功能一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防止野指针的出现。 转载于:https://www.cn...

weixin_34390996的博客 111

IOS 5中的strong和weak关键字

在Apple推出IOS 5后,就新增了很多功能,在开发中也一样,比如storyboard,个人觉得这真是个非常好的创新和工具,大大简化了开发,同时也更加生动。 今天将谈谈IOS 5中新增的strong和weak关键字 strong 用来修饰强引用的属性; @property (strong) SomeClass * aObject;  对应原来的  @property (reta

Ryan's zone 4016

objective-c(iOS5) 中weak和strong使用的区别

strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。 @property(strong) MyClass *myObject; 相当于@property(retain) MyClass *myObject; @property(

1809
上一篇: 堆和栈的区别
下一篇: 深拷贝和浅拷贝的区别
SMY_API
博客等级 码龄13年 5粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值