NSString 地址问题

2024-04-15

我正在尝试将地址打印到字符串,但我在第一个 NSLog 中得到不同的地址,而在第二个 NSLog 中得到相同的地址。那么你能告诉我这是怎么回事吗?这真的让我很困惑。预先非常感谢您的努力。

NSString *str1 = [[NSString alloc] init];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [[NSString alloc] init];

NSLog(@"str1 = %p , str2 = %p, str3 = %p",&str1,&str2,&str3);
NSLog(@"str1 = %p , str2 = %p, str3 = %p",str1,str2,str3);

Output

str1 = 0x7fff565b9c88 , str2 = 0x7fff565b9c80, str3 = 0x7fff565b9c78
str1 = 0x10c0a7060 , str2 = 0x10c0a7060, str3 = 0x10c0a7060

我不明白为什么str1, str2, and str3都指向同一个内存位置。


And why should str1, str2, str3都驻留在不同的内存地址?它们都是相同的不可变字符串。

See bbum的评论在这里 https://stackoverflow.com/questions/23726493/why-memory-for-primitive-data-types-is-not-allocated/23726795#comment36478269_23726795:

是的......一个相关利益的实现细节(但无论如何,决不会使答案无效);[[NSString alloc] initWithString:@"Hello world"]实际上不会在堆上创建字符串。它只会返回编译器在 mach-o 文件中放置的 __NSCFConstantString (或任何名称)。这只是一个有趣的细节,因为它不会改变您对所述字符串的消耗;它应该像任何其他物体一样对待。

强调我的。

这里发生的事情是,当编译器可以在编译时确定什么是不可变的NSString对象将是,它以不同的方式创建该字符串。正如 bbum 所说,最终这是一个实现细节,您在编写程序时不必担心。

但这的副作用意味着编译器能够使我的程序更具内存效率,因为它能够找到所有这些实例并使我的所有NSString它知道的指针应该保存相同的不可变值,所有指针都指向相同的单个内存地址。

我们可能可以通过以下方式获得相同的结果:

NSString *str1 = [[NSString alloc] init];
NSString *str2 = [NSString new];
NSString *str3 = [[NSString alloc] initWithString:@""];
NSString *str4 = [NSString stringWithString:@""];
NSString *str5 = @"";

这些实际上都是同一件事。

但是,如果我们创建另一个字符串:

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

如果我们打印,这将(很可能......我上次检查时)最终得到不同的值str6作为指针。

还有其他方法可以生成不可变的NSString在编译时没有像这样优化的对象。这里的要点是,如果编译器可以在编译时知道字符串将是什么,它将创建一个__NSCFConstantString在内存管理之外的后台,它将尽可能指向该单个实例。一旦它进入运行时间,如果您直接将其指向那里,它只会指向其他任何内容(str6 = str1)。否则,它不会浪费执行时间来尝试确定字符串是否相等。如果一个新的NSString碰巧相等并且在编译时没有发生,它只会由 ARC 处理。

编译器无法确定str6是与其他字符串相同的不可变字符串。这只是构建时的暗示,其他人最终都得到了相同的地址。

另一件有趣的事情是你永远不会看到dealloc呼吁__NSCFConstantString编译器正在为以您声明它们的方式声明的变量创建。因此,从内存的角度来看,编译器不仅使您的代码更加高效,而且还删除了all与这些字符串保持一致的内存管理代码的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSString 地址问题 的相关文章

  • 在 XCode 中链接静态 ObjC 库的过程

    我正在尝试链接到静态库 但不断收到链接器错误 我发现了一些发布示例的网站 但我无法看到我做错了什么 首先 我创建一个链接到我的库的项目 添加 gt 现有文件找到我的 xcodeproj 文件选择 将项目复制到目标组文件夹 选择我的宿主项目作
  • 如何使用 Swift 使用 TouchID?

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail
  • Objective-C – 拥有包含 TestFlight SDK 的 TestFlight 配置

    我已按照 TestFlight 的说明复制 发布 配置 我还使用 TestFlight SDK 从我的应用程序获取实时报告 通过这样做 我必须在我的应用程序中包含一些 TestFlight 代码 当然 我不想在我的应用程序的发布版本中包含此
  • 从 robovm 项目创建 iOS 静态库(JNI 中的 BAD_ACCESS)

    我有大量的Java代码 只有计算函数 没有UI 我想在iOS中将其重用为静态库 我的方法是使用robovm http www robovm com并按照robovm论坛中两篇文章中描述的非官方方式创建静态库 1 基本方式 https gro
  • Objective-C 中是否有相当于 C++ 动态转换的功能?

    如果我有两个类 子类和超类 SuperClass super new SuperClass SubClass sub new SubClass SubClass sub pointer The nice one line cast belo
  • 未知异常和崩溃

    当我尝试快速滚动表格视图或从远程重新加载数据时 我的应用程序崩溃了 当我先进行远程获取然后滚动表格视图时 一切似乎都工作正常 我不知道下面的崩溃日志意味着什么 它只是有时工作正常 有时崩溃 Incident Identifier 710A1
  • UITabBarController 为 TabBar 的每个 ViewController 提供不同的 Storyboard 文件

    我的团队正在开发一个具有 UITabBarController 的应用程序 我们正在使用 Storyboard 来开发界面和流程 由于我们是一个团队 所以我们不能将所有流程放在一个故事板中 因为这会导致与 SVN 同步出现问题 所以 解决方
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • 如何在 Objective C 中使用 swift 文件

    我想在 Objective C 代码中使用我的 Swift 文件 我找到了不同的链接 说明了如何操作 我的项目名称是 测试项目 我将 import Test Project Swift h 导入到我的 m 文件中 以在 Objective
  • AUGraphInitialize添加kAudioUnitSubType_Reverb2到AUGraph时出现错误代码-10868

    我正在尝试添加 AudioUnit 类型kAudioUnitSubType Reverb2 to an AUGraph我得到了 10868 kAudioUnitErr FormatNotSupported 支持的错误AUGraphIniti
  • ARC 禁止合成未指定所有权或存储的财产

    我创建了一个 property of UIColor property nonatomic UIColor color 然后我尝试合成它 synthesize color color 但我收到一个错误 ARC 禁止合成具有未指定所有权或存储
  • UIButton 和滑动手势

    我有一个UIView有两个UIButton每侧 左侧和右侧 都有 s 和UIImageView在中心 点击任一按钮都会改变UIImageView那行得通 我想要滑动的能力UIView以及它改变UIImageView 现在 您必须在UIIma
  • 使用 iOS 7 检索设备 WiFi MAC 地址

    我们的应用程序使用设备 WiFi MAC 地址来唯一标识设备 根据苹果文档 https developer apple com news id 8222013a我们将开始使用 UIDevice 的identifierForVendor 属性
  • 从视频生成缩略图 - ios7

    我用这个作为参考 从视频 URL 或 iPhone SDK 中的数据获取缩略图 https stackoverflow com a 6027285 1145339 该方法使用 MPMoviePlayerController 类而不是 AVF
  • 如何在我的应用程序中添加应用内购买

    我想在我的应用程序中使用应用程序购买应用程序 但我不知道如何执行此操作 任何人都可以帮助我如何做以及源代码在哪里 给我链接或代码 这里有一堆链接 应用内购买编程指南 http developer apple com iphone libra
  • 在 iOS 5 中,我们可以邀请人们使用我们的应用程序或通过 Facebook 从应用程序发送好友请求吗?

    考虑X and Y是朋友Facebook他们都在各自的手机中安装了一个应用程序 但他们在这一点上并不是朋友应用程序的好友列表 那么现在 可以X 发送好友请求 Use Facebook sdk 3 1 https developers fac
  • 如何以编程方式设置设备(UI)方向?

    希望屏幕 UI 上的所有内容都能够从横向左向右旋转 反之亦然 我该怎么做呢 这是私人的吗 我知道 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation inte
  • 如何检测 UISwipeGestureRecognizer 的结束?

    来自苹果文档 滑动是一种离散手势 因此每个手势仅发送一次关联的操作消息 void touchesEnded NSSet touches withEvent UIEvent event 当我使用 UISwipeGestureRecognize
  • 如何将图像放入此 UIPickerView 中?

    我不知道如何创建一个在文本一侧带有图像的自定义 UIPickerView 我一直在寻找一种方法 我刚刚发现了这个 UIView pickerView UIPickerView pickerView viewForRow NSInteger

随机推荐