返回信息流@interface Person : NSObject<NSCopying>
@property (copy,nonatomic) NSMutableString *name;
@property (assign,nonatomic) UInt64 age;
@end
- (id)copyWithZone:(nullable NSZone *)zone {
Person *p = [[self class] allocWithZone:zone];
p.age = self.age;
NSMutableString *str = [self.name mutableCopy];
p.name = str;
NSLog(@"self.name :%p,str: %p,p.name: %p,%p",self.name,str,p.name,[self.name mutableCopy]);
return p;
}
我在Person类里面实现了NSCopying协议的方法,此处新申请的可变字符串str,赋值给p.name,name用copy修饰,那么name的地址应该是不同于self.name也不同于str的地址的,但为什么p.name的地址和self.name的地址相同呢?
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #33381同步于 2017/8/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
【问题】求教一个个iOS copy的问题
dbdb
2017/8/19镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 wangxiaobupt 的大作中提到: 】
: NSMutableString 不能用copy修饰 而应该用strong
: 如果用strong p.name就与self.name 不同了
哦,懂了,多谢指教!
不对吧,怎么会相同?我的代码如下:
Person *p1 = [[Person alloc] init];
p1.name = [[NSMutableString alloc] initWithString:@"张三"];
p1.age = 18;
Person *p2 = [p1 copy];
打印的结果是:
self.name :0x1740379e0,str: 0x17407ae00,p.name: 0x174037d00,0x17407ae80
另外, 借楼一问,NSMutableString的使用场景是啥啊?我一直都是用NSString..
NSString本身就提供一些对字符串操作的方法,比如- (NSString *)stringByAppendingString:(NSString *)aString这样的,这些方法已经能满足我对字符串的操作需求了啊。
【 在 Nevemind 的大作中提到: 】
: 不对吧,怎么会相同?我的代码如下:
: Person *p1 = [[Person alloc] init];
: p1.name = [[NSMutableString alloc] initWithString:@"张三"];
: ...................
我就是自己写的测试代码,实际也没有应用。然而我用的xcode9确实显示的地址相同,回头我给你截个图看看
【 在 Nevemind 的大作中提到: 】
: 不对吧,怎么会相同?我的代码如下:
: Person *p1 = [[Person alloc] init];
: p1.name = [[NSMutableString alloc] initWithString:@"张三"];
: ...................
猜测编译器会自动做一些优化。你这个其实相当于 `[[self.name mutableCopy] copy]`,编译器发现你mutableCopy之后其实没有对产生出来的NSMutableString做什么操作,然后在对这个MutableString做copy的时候,它就直接把之前的那个NSString返回给你了,因为效果是一样的。你可以对MutableCopy出来的String做点操作,再copy一下,它就变了。以上纯属瞎猜?。
看一个更神奇的现象
```objc
NSMutableString *a = [@"hehe" mutableCopy];
NSMutableString *b = [@"hehe" mutableCopy];
NSMutableString *c = [@"hehe" mutableCopy];
NSLog(@"%p", [@"hehe" mutableCopy]); // 0x1005004a0
NSLog(@"%p", [@"hehe" mutableCopy]); // 0x1005004a0
NSLog(@"%p", [@"hehe" mutableCopy]); // 0x1005004a0
NSLog(@"%p", a); // 0x100500250
NSLog(@"%p", b); // 0x100500290
NSLog(@"%p", c); // 0x100500440
```
【 在 dbdb 的大作中提到: 】
: @interface Person : NSObject<NSCopying>
: @property (copy,nonatomic) NSMutableString *name;
: @property (assign,nonatomic) UInt64 age;
: ...................
你有没有试试 p.name = [str mutableCopy];
估计会有惊喜的。