This is correct. The _name
instance variable was probably declared as @private
(the default for auto-synthesizing properties) and therefore it is inaccessible by subclasses.
In well-designed class hierarchies and specifically framework classes for which there is no source code available you will find most if not all instance variables inaccessible by subclasses because it hides the implementation detail and makes future changes to the base class possible. Imagine if the base class needed to verify the name property whenever it changes - if subclasses could assign directly to the ivar they would bypass the checks added to the ivar setter method.
PS: I find dot notation friendlier on the eyes:
self.name = rootName;
UPDATE regarding the "don't send messages to self
in init/dealloc" rule:
This can easily be avoided by redesigning the class to not take non-essential parameters in its init method. A cleaner version of this subclass would be:
UtilityNode* un = [UtilityNode node];
un.name = @"some name";
If the node absolutely requires the parameter to be set, warn the user via an NSAssert
in the method where the name is required to be valid.