NSString copy not copying?

2019-01-26 09:47发布

  NSString *myString = @"sample string";
  NSString *newString = [myString copy];

If I set a breakpoint after these two lines, the pointer for myString is the same as the pointer for newString.

WTF? Isn't NSString copy supposed to return a pointer to a new object? Or am I missing something fundamental about how copy is supposed to work?

4条回答
我想做一个坏孩纸
2楼-- · 2019-01-26 10:41

Think about this: NSMutableString is a subclass of NSString. When your property is declared as NSString, you don't expect it to change.

Consider, if you used retain and someone gave you an NSMutableString and then later on does change it, your class will be broken.

However, you may think that always copying is slow. So NSString's copy simply calls retain. NSMutableString's copy makes an actual copy.

It is usually better to give spit out an NSString * because people won't have to copy it all the time.

查看更多
劳资没心,怎么记你
3楼-- · 2019-01-26 10:44

You can Allocate new variable like in sample

NSString *anotherString = [[NSString alloc] initWithString:originalString];
查看更多
男人必须洒脱
4楼-- · 2019-01-26 10:45

It's a better practice to do copy the string value returned by a method, since the returned value maybe a mutable string object, and this value can be modified in other thread after returned by that method.

查看更多
做自己的国王
5楼-- · 2019-01-26 10:47

Since NSString is not mutable it might just internally increase ref count and be done with it.

When you release one of those NSStrings it might just decrement ref count - standard memory management.

Do you see any issues with that?

查看更多
登录 后发表回答