Objective-C中NSString对象retainCount之谜探索

2024-05-03 16:58

本文主要是介绍Objective-C中NSString对象retainCount之谜探索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Objective-C对于NSString字符串,会采用不同的实现形式,鄙人经过总结得出一下结论:(可能有误,则其善者而从之)

1. 字符串常量,类似于C语言形式,静态区存储

NSString *s = @"test";

NSLog(@"s:%lx",[s retainCount]);//输出值为0xffffffffffffffff(UINT_MAX)

NSLog(@"s:%ld",[s retainCount]);//输出值-1,由于0xffffffffffffffff补码表示的值为-1

因为"test"为字符串常量,系统不会采用计数方式回收,所以不会对其作引用计数,即使我们对s如何retain或release,其值保持不变,对象也保持不变。

 

2. stringWithFormat

NSString *s = [NSString stringWithFormat:@"%s", "test"];

NSLog(@"s:%d",[s retainCount]); //输出值为1

使用stringWithFormat创建的NSString为变量,系统会进行引用计数,和普通对象一样

 

3. stringWithString

stringWithString这个方法比较特别:分两种情况,它的retainCount取决于它后面跟的string对象

情况1:NSString *s1 = [NSString stringWithString:@"test"];

             NSLog(@"s1:%d",[s1 retainCount]); // 2147483647

情况2:NSString *s2 = [NSString stringWithString:[NSString stringWithFormat:@"test,%d",1]];

             NSLog(@"s2:%d",[s2 retainCount]); // 2

可以看到情况1为"常量"对象,其retainCount方法的实现返回的是maxIntValue。

情况2输出值为2,也证明了前面说的,这个方法生成的只是一个对另一个对象的引用。一个对象实例,一次stringWithFormat (+1)和stringWithString(+1),它的retainCount为2,同时都被当前的AutoreleasePool管理。


4.NSMutableString

NSMutableString* myStr3 = [NSMutableStringstringWithString:@"string 3"];

输出1,有引用计数


本文部分内容引用自http://www.cnblogs.com/hibernate6/archive/2012/04/26/2521879.html

                                                          

                                                          2013-7-13于Mac Firefox

这篇关于Objective-C中NSString对象retainCount之谜探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957213

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与