Char * против NSString * - PullRequest
       13

Char * против NSString *

4 голосов
/ 26 марта 2011

Я пытаюсь избавиться от путаницы при работе с С.

Использует ли char *name в некотором смысле то же самое, что и работа с NSString *name в том смысле, что указатель все еще указывает на первое выделение памяти для него?

Конечно NSString имеет кучу дополнений, но это не то, что я имею в виду, будет работать с char *name, позволит мне работать, как если бы это был NSString *name, так что я мог бы в будущем просто работать с указателем "имя"?

Ответы [ 5 ]

19 голосов
/ 26 марта 2011

Ответ - нет.

char* предназначен для указания на простой массив (или один) char значений данных.

char* myCharPtr = "This is a string.";
//In memory: myCharPtr contains an address, e.g. |0x27648164|
//at address 0x27648164: |T|h|i|s| |i|s| |a| |s|t|r|i|n|g|.|\0|

С другой стороны, NSString *name будет указателем на объект, который может иметь лотов дополнений, и вы не можете полагаться на то, где хранятся фактические символьные данные или как. Он не закодирован как ASCII (Шерм Пендли внизу сказал, что это UTF-16), и может содержать дополнительные данные, такие как длина строки и т. Д.

NSString* myStringPtr = @"This is an NSString.";
//In memory: myStringPtr contains e.g. |0x27648164|
//at address 0x27648164: |Object data|length|You don't know what else|UTF-16 data|etc.|

Вы изменяете и получаете доступ к неизвестным объектам через их открытые методы, потому что вы не знаете, как они отформатированы в памяти, и, следовательно, не можете получить доступ к их данным напрямую. (Или потому, что они заключают себя в капсулу, чтобы скрыть это от вас.)

Вы все еще можете использовать указатель NSString в будущем, если вы объявите его как NSString *name. Вот что я имею в виду:

NSString *name = @"This is a string.";
NSString *sameName = name; //This is pointing to the same object as name
NSLog(@"%@", sameName); //This prints "This is a string.", and if NSStrings were mutable, changing it would change name as well.
                 //They point to the same object.
4 голосов
/ 26 марта 2011

char* и NSString* - две совершенно разные реализации строк.

NSString может использоваться только в Objective C (не в простом C), представляет неизменяемые строки, основан на символах Unicode и - будучи объектно-ориентированным классом - предоставляет множество методов. Кроме того, они подсчитываются и всегда размещаются в куче.

char* - это просто любой массив байтов, кодировка которого не очень хорошо определена, она изменчива и не является объектно-ориентированной. char массивы могут быть размещены в куче (с malloc) или в стеке. Первый требует вызова free, а последний никогда не должен быть освобожден.

2 голосов
/ 26 марта 2011

использует имя * в некотором смысле так же, как работа с именем NSString * в ощущение, что указатель еще указывает на первое выделение памяти за это?

Я думаю, что вы должны рассматривать имя NSString * как дескриптор объекта, а не указатель на объект, и поэтому не предполагайте, что оно указывает на первое выделение памяти. Я думаю, это была бы лучшая метафора.

0 голосов
/ 26 марта 2011

В некотором смысле - несколько бесполезный смысл, чтобы быть уверенным - они равны , то есть оба являются типами указателей, которые ссылаются на адрес памяти.Это сходство оказывается не очень полезным на практике.Чтобы использовать любой из них, вы должны принять во внимание тип «вещи», на которую они указывают, и то, как каждый использует массив char и экземпляр NSString, совершенно другой.Даже для чего-то такого простого, как присвоение, нужно обрабатывать экземпляр NSString в соответствии с правилами управления памятью Какао, используя либо -copy, либо -retain вместо простого присваивания "foo = bar".

0 голосов
/ 26 марта 2011

Нет,

char * - указатель на массив символов. NSString - указатель на объект NSString. Я не могу найти какую-либо документацию об этом, но я считаю, что NSString содержит символ *. Выполнение name [1] для NSString * name будет ссылаться на 2-й элемент массива объектов NSString.

...