对 string literal (字符串字面量) 执行 copy
要打印指针指向对象的地址和指针本身的地址,可以使用 %p
格式符来输出指针地址。以下代码,展示了 originalString
和 copiedString
的指针地址和指向对象的地址:
objc
NSString *originalString = @"Hello, World!";
NSString *copiedString = [originalString copy];
// 打印字符串内容
NSLog(@"Original: %@", originalString); // 输出: Hello, World!
NSLog(@"Copied: %@", copiedString); // 输出: Hello, World!
// 打印指针本身的地址
NSLog(@"Original pointer address: %p", &originalString);
NSLog(@"Copied pointer address: %p", &copiedString);
// 打印指针指向对象的地址
NSLog(@"Original object address: %p", originalString);
NSLog(@"Copied object address: %p", copiedString);
Xcode Version 15.1 (15C65) & 模拟器(iPhone 15)运行结果如下:
// 打印的内容一样
Original: Hello, World!
Copied: Hello, World!
// 指针本地的地址不一样,说明是不同的指针
Original pointer address: 0x7ff7b1a5fa98
Copied pointer address: 0x7ff7b1a5fa90
// 不同的指针指向同一个对象
Original object address: 0x10e4a0070
Copied object address: 0x10e4a0070
解释
Original: Hello, World!
和Copied: Hello, World!
输出字符串内容。Original pointer address: %p
输出指针originalString
本身在栈中的地址。Copied pointer address: %p
输出指针copiedString
本身在栈中的地址。Original object address: %p
输出originalString
指向的字符串对象在堆中的地址。Copied object address: %p
输出copiedString
指向的字符串对象在堆中的地址。
可以看到,由于 NSString
是不可变对象,执行 copy
方法时并不会产生新的对象,而是返回相同的对象。所以 originalString
和 copiedString
指向相同的内存地址(对象地址相同),但是它们的指针本身在栈中的地址是不同的。
对 string literal (字符串字面量) 执行 mutableCopy
objc
NSString *originalString = @"Hello, World!";
NSString *copiedString = [originalString mutableCopy];
// 打印字符串内容
NSLog(@"Original: %@", originalString); // 输出: Hello, World!
NSLog(@"Copied: %@", copiedString); // 输出: Hello, World!
// 打印指针本身的地址
NSLog(@"Original pointer address: %p", &originalString);
NSLog(@"Copied pointer address: %p", &copiedString);
// 打印指针指向对象的地址
NSLog(@"Original object address: %p", originalString);
NSLog(@"Copied object address: %p", copiedString);
Xcode Version 15.1 (15C65) & 模拟器(iPhone 15)运行结果如下:
Original: Hello, World!
Copied: Hello, World!
// 不同的指针
Original pointer address: 0x7ff7be102a98
Copied pointer address: 0x7ff7be102a90
// 指向不同的对象
Original object address: 0x101dfd070
Copied object address: 0x600000c80090