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?
Think about this:
NSMutableString
is a subclass ofNSString
. When your property is declared asNSString
, you don't expect it to change.Consider, if you used
retain
and someone gave you anNSMutableString
and then later on does change it, your class will be broken.However, you may think that always
copy
ing is slow. SoNSString
'scopy
simply callsretain
.NSMutableString
'scopy
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.You can Allocate new variable like in sample
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.
Since
NSString
is not mutable it might just internally increaseref count
and be done with it.When you
release
one of those NSStrings it might just decrementref count
- standard memory management.Do you see any issues with that?