You're right, the copy method NSMutableString returns an immutable NSString . This convention is in Cocoa, it also applies to NSMutableArray , NSMutableDictionary , etc.
So, if you want your property to remain volatile, you must declare it as retain . If you need a copy of semantics, but still want the result to be changed, you would need to implement your own setter for the property (and use mutableCopy for copying).
The reason you usually see copy for string properties is because it is often desirable to have a guarantee that the string is immutable, regardless of which string is assigned to the property. Otherwise, you may accidentally change the same line in another place, which can be difficult to debug. Immutable objects can also be thread safe.
source share