I’ve asked myself exactly the same thing at that part. Now, looking at it again, it seems more clear to me:
First, in parser:didStartElement: when we set one of our properties (title, infoString) to currentString, we are actually making both pointers point at the same string object, like you just said. The string is just empty at this point, and it has 2 owners (currentString and one of our properties).
Then, in parser:foundCharacters: we append the characters one by one to the string using the currentString pointer. Since our property (title, infoString) points to the same string object, it will be “updated” as well.
At parser:didEndElement: the string is finally complete. Setting currentString to nil doesn’t set the string to nil, but instead makes the pointer currentString point to a nil object. The original string object remains intact because, although it just lost one owner, it is still owned by one of our properties (title, infoString). This happens just because our string properties are of the strong type, meaning of course that they will retail the object they point to, as in this case.
If, otherwise, title or infoString were properties of type weak, they would’ve been set to nil as well.