Здесь происходит несколько вещей. Во-первых, удаление объекта не обязательно очищает память, которую ранее занимал объект. Он просто помечается как бесплатный. Если вы не сделаете что-то еще, что приведет к повторному использованию этой памяти, старые данные будут просто зависать.
В конкретном случае NSString это кластер классов, что означает, что реальный класс, который вы получаете от alloc / init, является некоторым конкретным подклассом NSString, а не экземпляром NSString. Для «постоянных» строк это чрезвычайно легкая структура, которая просто поддерживает указатель на константу C-строки. Независимо от того, сколько копий этого страйка вы делаете, или сколько раз вы его выпускаете, вы не будете влиять на достоверность указателя на строку константы C.
Попробуйте проверить [класс stringPointer] в этом случае, а также в случае изменяемой строки или отформатированной строки, которая фактически использует символ формата и аргументы. Вероятно, у всех трех будут разные классы.