Почему строки Obj-C всегда * NSString не NSString - PullRequest
1 голос
/ 09 марта 2010

Это нормально, что объявление

NSString c="a sample string";

не может работать, и должен объявить его как NSString *? Это отличается от строк C ++, я прав? Можно ли его обобщить на другие объекты Obj-C?

Ответы [ 2 ]

7 голосов
/ 09 марта 2010

Поскольку объекты Objective C всегда указатели (включая NSString)

0 голосов
/ 09 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...