NSString,NSMutableString使用retain, copy理解

VS Code配置MinGW64编译非线性优化库NLopt VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。 阅读详情

一直以为copy就是深拷贝,会产生一个新的对象,指针和内容都是新的,retain只是引用计数+1。

今天测试代码的时候发现一个问题,再经仔细一测,才发现不是这么回事.

int main(int argc, char *argv[])
{
    NSString *str = @"google";
    NSString *strRetain = [str retain];
    NSString *strCopy = [str copy];
    NSMutableString *strMutCopy = [str mutableCopy];
    
    NSLog(@"str        = %p,    retainCount = %d", str, [str retainCount]);
    NSLog(@"strRetain  = %p,    retainCount = %d", strRetain, [strRetain retainCount]);
    NSLog(@"strCopy    = %p,    retainCount = %d", strCopy, [strCopy retainCount]);
    NSLog(@"strMutCopy = %p,     retainCount = %d", strMutCopy, [strMutCopy retainCount]);
   
}

output:


 

 观察打印信息可以发现,不管是retain还是copy对于NSString来说都是浅拷贝,还是指向的之前的内存区域。retainCount=-1是因为str为字符串常量,系统会用UINT_MAX来标记,系统不收回,也不做引用计数。
NSString 应用 retain 还是 copy?

1。对NSString应用retain,效率无疑是最好的

2。用copy最安全,因为NSString 为 NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们希望的,所以用copy最安全。

参考文档 NSCopying Protocol Reference

Your options for implementing this protocol are as follows:

  • Implement NSCopying using alloc and init... in classes that don’t inherit copyWithZone:.
  • Implement NSCopying by invoking the superclass’s copyWithZone: when NSCopying behavior is inherited. If the superclass implementation might use the NSCopyObject function, make explicit assignments to pointer instance variables for retained objects.
  • Implement NSCopying by retaining the original instead of creating a new copy when the class and its contents are immutable.

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备 【WRF数据准备】MODIS静态地理数据下载及制备 阅读详情

相关推荐

Petalinux 2021.2 下 Qt组件编译报错?手把手教你修改bb文件搞定qt3d/qtquickcontrols2

本文详细解析了Petalinux 2021.2环境下Qt组件(如qt3d、qtquickcontrols2)编译报错的解决方案。通过修改bb文件或使用bbappend文件覆盖,有效解决`petalinux-build --sdk`命令执行时的源码获取失败或哈希校验不匹配问题,并提供验证与调试技巧,帮助开发者快速修复构建流程中断问题。

weixin_29188997的博客 216

NSString属性声明中的copy和retain区别

前几天去面试,被问到了NSString属性声明中的copy和retain具体区别,对内存计数的影响,汗,当时没整明白,也没答出来,只知道NSString一般用copy. 首先做以下几个变量声明: @property (retain, nonatomic) NSString *retainStr; @property (copy, nonatomic) NSString *cop...

defei4441的博客 210

普通人也能看懂的Transformer源代码解释(PyTorch)

Transformer源代码解释之PyTorch篇 章节 词嵌入 位置编码 多头注意力 搭建Transformer 在这里插入图片描述 词嵌入 Transformer本质上是一种Encoder,以翻译任务为例,原始数据集是以两种语言组成一行的,在应用时,应是Encoder输入源语言序列,Decoder里面输入需要被转换的语言序列(训练时)。一个文本常有许多序列组成,常见操作为将序列进行一些预处理(如词切分等)变成列表,一个序列的列表的元素通常为词表中不可切分的最小词,整个文本就是一个大列表,元素为一个一

qq_50974223的博客 4167

iOS-NSMutableString使用copy描述崩溃

用copy修饰NSMutableString导致了crash,如下 原因: 当我们用copy修饰NSMutableString后当我们实例化时,生成的是不可变的,当我们第一次使用可变操作时程序会崩溃,因此说不要用copy修饰NSMutableString 因此使用strong来进行修饰,我们使用NSMutableString就是想应用它的可变属性,自然不能实例化成不可变;与其同理的还有可变数...

MinggeQingchun的博客 749

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 396

智护健康:基于 ESP32 的可穿戴式心率血氧远程监测手环设计与实现

随着健康管理理念的普及,可穿戴式健康监测设备成为刚需。本文设计了一款基于 ESP32 芯片的可穿戴式心率与血氧远程监测手环,通过集成专业生物传感器采集生理数据,借助 ESP32 的无线通信能力实现数据远程传输,搭配手机 APP 与云平台完成数据存储、分析与预警。文中详细阐述了硬件选型、模块接线、软件设计流程及核心代码实现,该手环具备低功耗、高精度、实时性强等特点,可满足日常健康监测与远程照护需求。

weixin_42300449的博客 1199

iOS面试必看!谈谈NSString和NSMutableString的浅拷贝和深拷贝

字符串的浅拷贝和深拷贝 我们都知道@property修饰字符串时采用关键字copy,那是什么原因的,面试时常问的浅拷贝和深拷贝是什么呢? 我们先看一段代码,NSString对象调用copy方法控制台输出的name和str1地址是一样的,说明NSString没有创建新的对象,这种叫做浅拷贝,str2的地址和name的地址不同,通过断点我们知道str2指针其实是NSMutableString类型,调用mutableCopy方法创建了新的对象,返回NSMutableString类型的对象,叫做深拷贝。

CoderDCLiu的博客 455

【CAN总线测试】——通讯相关诊断测试

本章主要介绍通讯相关诊断测试用例设计

LOVE135149的博客 1813

理解 retain 、copy 、NSMutableString 、NSString 的用法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34090562的博客 120

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 97

39-高级优化技术:指令调度与乱序执行 - 手把手教你手写CPU

本文介绍了现代处理器设计中提高指令级并行性(ILP)的两种关键技术:指令调度和乱序执行。指令调度分为静态调度(由编译器完成)和动态调度(由硬件完成),后者能更好适应运行时情况但复杂度更高。乱序执行通过动态重排指令顺序提高硬件利用率,其核心组件包括重排序缓冲区、保留站和寄存器重命名。文章提供了保留站的Verilog实现示例,并分析了不同优化技术在性能、硬件开销和功耗方面的权衡。最终指出,CPU设计需根据性能、功耗等需求选择合适的优化技术。

2301_79143213的博客 85

IOS开发中copy和retain的区别

在ios开发中我们一般都这么定义:@property (nonatomic,copy) NSString *name,而不这么定义:@property (nonatomic,retain) NSString *name,两者的差别就在一个使用copy,一个使用retain。 一直以来都不明白为什么,今天通过查阅资料总算弄明白了,所以记录一下两者的区别。

feisongfeiqin的博客 2847

C语言实现惯性导航初始对准全部核心代码

惯性导航初始对准包括间接粗对准和卡尔曼滤波精对准,其中。为基于卡尔曼滤波的精对准,其中。

十八与她的博客 2283

浅谈深浅复制,retain与copy的区别(摘抄)

在iOS开发中我们一般都这么定义:@property (nonatomic,copy) NSString *name,而不这么定义:@property (nonatomic,retain) NSString *name,两者的差别就在一个使用copy,一个使用retain。  一直以来都不明白为什么,今天通过查阅资料总算弄明白了,所以记录一下。  在说明白retain和copy的区别,首先

qq_33576957的博客 456

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ios知识总结

1、Object-C有多继承吗?没有的话用什么代替? cocoa 中所有的类都是NSObject 的子类 多继承在这里是用protocol 委托代理 来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念. ood的多态特性 在 obj-c 中通过委托来实现. 2、Object-C有私有方法吗?私有变量呢? objective-c – 类里面的方法只有两种, 静态方法和

iosBluevip的博客 569

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ios面试题整理

ios面试题整理 分类:iphone开发2013-04-01 12:353800人阅读评论(0)收藏举报 转自:http://blog.sina.com.cn/s/blog_a7c44c880101aibh.html 1、Object-C有多继承吗?没有的话用什么代替? cocoa中所有的类都是NSObject的子类 多继承在这里是用protocol...

weixin_30723433的博客 72

Camera2Demo

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

iOS中assign,copy,retain之间的区别以及weak和strong的区别,NSString什么时候用copy,什么时候用strong

@property (nonatomic, assign) NSString *title;  什么是assign,copy,retain之间的区别?  assign: 简单赋值,不更改索引计数(Reference Counting)。  copy: 建立一个索引计数为1的对象,然后释放旧对象  retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数

yq7788998的博客 1796

关于retain以及copy特质的理解

对于深拷贝和浅拷贝一直是objc中得一个重点和难点 这里说一些自己的理解 首先讲一下retain,即对receiver的保留,仅仅使其refcount+1 以NSString对象为例  在讨论引用计数之前必须声明清楚如NSString*str = @“1234”;这类存储在静态存储区的内存没有引用计数这个概念即refcount对其是没有意义的。 如下例子 NSString*str

jacky_jin的专栏 657

NSString属性使用copy还是strong

下面请看一段代码: 在ViewController.h中定义一个NSString的属性: 此处定义name的属性关键字为copy @property (nonatomic, copy) NSString *name;然后在ViewController.m中写这样一段代码:NSMutableString *rString = [[NSMutableString alloc]initWithStr

逸轻紫的博客 365

copy和strong的区别

对于copy和strong的区别主要就是能区分深拷贝还是浅拷贝。 以字符串为例:@property (retain,nonatomic) NSString *secondString; @property (copy, nonatomic) NSString *thirdString;- (void)test { NSMutableString *firstString = [NSMu

TF_LIU的博客 914

iOS的copy概念详解

1. copy概念浅复制与深复制 copy即复制,有浅复制和深复制两种。浅复制即引用复制,只拷贝对象的引用,不分配新的内存空间,深复制即对象拷贝,会创建一个对象的副本,分配新的内存空间,与原对象独立。 深复制(深拷贝,内容拷贝,deep copy) 源对象和副本对象是不同的两个对象 源对象引用计数器不变, 副本对象计数器为1(因为是新产生的) 本质是:产生了新的对象浅复制(浅拷贝,指针拷贝

lushuner的专栏 797

retain和copy还有assign的区别,以及引用计数

retain和copy还有assign的区别,以及引用计数 (2010-07-19 17:15:07) 转载▼ 标签: retain alloc release autorelease copy assign 指针 引用 持有计数 分类: iPhone 一,retain, copy, assign区别1. 假设你用malloc分配...

张明炜 152

iOS中assign、copy 、retain等关键字的含义

assign: 简单赋值,不更改索引计数 copy: 建立一个引用计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1Copy其实是建立了一个相同的对象,而retain不是: 比如一个NSString对象,地址为0×1111,内容为@”STR” Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象ret

qq_35827461的博客 703

OC中的字符串属性(深拷贝和浅拷贝)

我们在项目中定义一个字符串属性的时候,有时候见到别人用retain,有时候见到用copy。那么到底这两种用法有什么区别呢? 这就需要我们了解深拷贝和浅拷贝和区别了。 其实copy是创建一个新对象,retain是创建一个指针。 Copy其实是建立了一个相同的对象,而retain不是。怎么理解呢? 比如我们有一个NSString对象,地址为0×1212,内容为@”str” 。Copy到另外一个NSS

凉城旧梦的博客 1550
上一篇: "ios模拟器未能安装此应用程序"解决办法
下一篇: IOS图像拉伸解决方案
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值