The NSCopying copyWithZone: implementation does not check isSet. This causes the copy not to be a true copy, since all the isSet properties will be set to YES on the newly copied object.
Note, updating to provide some more clarity:
In this example, it's fixed:
Without the if check on _nameIsSet, the newly copied object will have _nameIsSet set to YES but with a nil name.