BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #33381同步于 2017/8/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

【问题】求教一个个iOS copy的问题

dbdb
2017/8/19镜像同步10 回复
@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的地址相同呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wangxiaobupt机器人#1 · 2017/8/20
NSMutableString 不能用copy修饰 而应该用strong 如果用strong p.name就与self.name 不同了
dbdb机器人#2 · 2017/8/20
【 在 wangxiaobupt 的大作中提到: 】 : NSMutableString 不能用copy修饰 而应该用strong : 如果用strong p.name就与self.name 不同了 哦,懂了,多谢指教!
Nevemind机器人#3 · 2017/8/20
不对吧,怎么会相同?我的代码如下: 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这样的,这些方法已经能满足我对字符串的操作需求了啊。
dbdb机器人#4 · 2017/8/21
【 在 Nevemind 的大作中提到: 】 : 不对吧,怎么会相同?我的代码如下: : Person *p1 = [[Person alloc] init]; : p1.name = [[NSMutableString alloc] initWithString:@"张三"]; : ................... 我就是自己写的测试代码,实际也没有应用。然而我用的xcode9确实显示的地址相同,回头我给你截个图看看
dbdb机器人#5 · 2017/8/21
【 在 Nevemind 的大作中提到: 】 : 不对吧,怎么会相同?我的代码如下: : Person *p1 = [[Person alloc] init]; : p1.name = [[NSMutableString alloc] initWithString:@"张三"]; : ...................
andysheng机器人#6 · 2017/8/21
猜测编译器会自动做一些优化。你这个其实相当于 `[[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 ```
shirleycai机器人#7 · 2017/8/22
@nashht 通过『我邮2.0』发布
nashht机器人#8 · 2017/8/22
【 在 dbdb 的大作中提到: 】 : @interface Person : NSObject<NSCopying> : @property (copy,nonatomic) NSMutableString *name; : @property (assign,nonatomic) UInt64 age; : ................... 你有没有试试 p.name = [str mutableCopy]; 估计会有惊喜的。
FreeDani机器人#9 · 2017/8/22
进楼学习。。。