ios - NSArray 地址问题

标签 ios nsarray

我正在尝试打印数组的内存地址,但我得到的所有三个数组的内存地址都相同 让我解释更多 我取了三个数组

NSArray *arr1 = [[NSArray alloc]init];
NSArray *arr2 = [[NSArray alloc]init];
NSArray *arr3 = [[NSArray alloc]init];

当我打印内存地址时

NSLog(@"arr1 = %p, arr2 = %p, arr3 = %p", arr1, arr2, arr3);

所有内存地址相同

输出:

arr1 = 0x7f9c01d21550, arr2 = 0x7f9c01d21550, arr3 = 0x7f9c01d21550

但是当我用这段代码打印内存地址时

NSLog(@"arr1 = %p, arr2 = %p, arr3 = %p", &arr1, &arr2, &arr3);

内存地址不同

输出:

arr1 = 0x7fff5fb8e338, arr2 = 0x7fff5fb8e330, arr3 = 0x7fff5fb8e328

我不知道为什么首先 NSLog 打印相同的地址。 预先感谢您的帮助

最佳答案

第一个 NSLog 打印数组。第二个 NSLog 打印了存储数组的三个变量的地址。对于第二个 NSLog,即使您从未分配数组,您也会得到相同的结果。

第一个 NSLog 打印相同地址三次的原因是 [[NSArray alloc] init] 将总是返回相同的对象。调用 [[NSArray alloc] init] 十亿次,只会创建一个 NSArray 对象。既然 NSArray 是不可变的,你永远不能向这个空数组添加任何东西,为什么操作系统要浪费空间分配多个数组呢? (如果你有很多空数组,这实际上是一个非常有用的优化)。

关于ios - NSArray 地址问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099101/

相关文章:

ios - 使用Multipeer Connectivity(Swift 2)在目标iPhone中从发送者部分接收了音频文件

Swift:检查 NSArray 中的哪个值最接近另一个给定值

cocoa - 将 NSTableView 绑定(bind)到 NSMutableArray

objective-c - 在NSArray中增加NSNumber

objective-c - 无法从 NSMutableDictionary 中的单个元素形成数组 -[__NSCFString count] :

ios - 在 iPhone X(及更高版本)上启动与键盘大小相同的 UIDatePicker

ios - 动画时将 UITableViewCell 子 UIImageView 置于前面

ios - Firebase 使用 queryLimitedToLast 获取更多数据

ios - 如何使用 UIActivityController : Objective C? 在 whatsapp 上共享文本和图像(两者)

objective-c - 从 NSArray 以字节形式检索 UIImage - iOS