Это возвращает нас к правильному дизайну кода даже в C ++, если у вас есть строковый класс C ++ и вы создали его без указателя, тогда весь набор данных будет храниться в стеке, и когда эта переменная будет скопирована, все члены будут быть скопирован. В c ++ существует перегрузка операторов для выполнения этой работы, поэтому класс может переопределить оператор присваивания, чтобы правильно скопировать данные класса, в target-c и обычном c перегрузка операторов отсутствует. Так что, если у вас ... Строка а, б; и вы сделали a = b; он будет копировать значение всех членов, которые могут быть указателями на выделенные строки в памяти. В c ++ ваш строковый класс может перегружать присваивание, так что когда вы делаете a = b, он фактически выделяет копию строки в a вместо простого указателя на данные b. Причина, по которой это важно, состоит в том, что представьте себе, что редактирование данных b приводит к тому, что, возможно, a также будет частично обновляться (однако обновление не обязательно будет корректным в зависимости от всех элементов, которые были изменены в b, a может стать частично недействительным). Привязывая вещи к указателю, становится очень ясно, что NSString * a, * b; а = б. Вы знаете, что a - это просто указатель на b, и если b изменяется, a также изменяется.