Immutable objects will often implement their copyWithZone:
method as return [self retain]
, since there's no point in making a separate copy of the data if it's never going to change. They still need to implement the method, though, to be compatible with anything that expects NSCopying conformance (e.g. NSDictionary keys).
As for usage, I would stick with the same usage patterns as other "value" properties, and you won't see any performance difference since they'll likely be calling retain
from copy
anyway. That also covers you for cases like the addition of a mutable subclass that has a non-trivial implementation of NSCopying.