2013-02-20 2 views
7

Я понимаю, что 99% из вас думают «что ж *** ...» Но, пожалуйста, помогите мне разобраться с этой концепцией использования pointers. Я уверен, что мой конкретный вопрос поможет многим новичкам.Какое самое большое преимущество использования указателей в ObjectiveC

Я понимаю, какие указатели ARE и что они являются ссылкой на адрес в памяти и что с помощью оператора (*) вы можете получить значение в этом адресе.

Скажем:

int counter = 10; 
int *somePointer = &counter; 

Теперь у меня есть адрес в памяти counter, и я могу косвенно указывать на его значение, делая это:

int x = *somePointer; 

Что делает x = 10, верно?

Но это самый простой пример, и для этого случая я мог бы использовать int x = counter; и получить это значение, поэтому, пожалуйста, объясните, почему указатели действительно важны в Objective-C и некоторых других языках ... в каком случае будет ли смысл иметь только указатель?

Цените его.

+3

Указатель не является ссылкой на адрес. Вы можете сказать, что указатель - это ссылка на память, или что это ссылка на переменную, но это * - * адрес. (Технически, указатель - это переменная, а ее значение - адрес. Английский неоднозначно.) –

+4

Не просто статически выделять объекты. – CodaFi

+0

Возможно, вы захотите начать там: http://stackoverflow.com/questions/5203284/objective-c-and-pointers/5203296#5203296 –

ответ

2

Что является большим преимуществом использования указателей в ObjectiveC

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

+0

Спасибо allot @ H2CO3 – NickCave

5

Объектив-C имеет указатели, потому что это эволюция C, которая использовать указатели широко. Преимущество указателя на объектно-ориентированном языке, таком как Objective-C, заключается в том, что после создания объекта вы можете передавать указатель на объект вместо того, чтобы проходить вокруг самого объекта. Другими словами, если у вас есть какой-то объект, занимающий большой объем пространства для хранения, то передача указателя намного эффективнее по сравнению с копией самого объекта. Это может быть не заметно в простых случаях, когда вы имеете дело только с примитивными типами, например int, но когда вы начинаете работать с более сложными объектами, память и экономия времени огромны.

Что еще более важно, указатели делают это много проще для разных частей вашего кода, чтобы разговаривать друг с другом. Если переменные могут быть переданы только в функции «по значению» вместо «по ссылке» (что происходит, когда вы используете указатели), тогда функции никогда не смогут изменить свои входы. Они могли только изменить состояние вашей программы, либо вернув значение, либо изменив глобальную переменную, избыточность которой обычно приводит к неаккуратным, неорганизованному коду.

Вот конкретный пример. Предположим, у вас есть метод Objective-C, который будет разбирать строку JSON и возвращать NSDictionary:

+ (NSDictionary *)parseJsonString:(NSString *)json 
          error:(NSError **)error; 

метод будет делать синтаксический анализ и возвращает NSDictionary, если все идет хорошо. Но что, если есть какая-то проблема с входной строкой? Нам нужен способ указать пользователю (или, по крайней мере, программисту), что произошло, поэтому у нас есть указатель на указатель на NSError, который будет содержать эту информацию.Если наш метод не работает (возможно, возвращая nil), мы можем разыменовать параметр error, чтобы узнать, что пошло не так. Мы эффективно выполнили наш метод с двумя разными типами возвращаемых значений: обычно он возвращает NSDictionary, но он также может вернуть NSError.

Если вы хотите больше узнать об этом, вам может потребоваться больше удачи в поиске «указателей на C», а не «указателей в Objective-C»; указатели, конечно, широко используются в Objective-C, но все базовые механизмы идентичны всем основным функциям C.

+2

Основополагающий механизм не только точно идентичен самому C, он * is * C – CodaFi

+0

@CodaFi Ты сегодня блестящий, как всегда: D – 2013-02-20 23:14:56

+0

@CodaFi Да, хорошо сказано. – bdesham

1

товара:

Что делать, если я сказал вам, чтобы написать мне программу, которая будет поддерживать набор счетчиков, но количество счетчиков будет введен пользователем, когда он начал программу. Мы кодируем это с помощью массива целых чисел, выделенных в куче.

int *counters = malloc(numOfCounters * sizeof(int)); 

Malloc работает с памятью напрямую, поэтому он по своей природе возвращает указатель. Все объекты Objective-C выделены с помощью кучи malloc, поэтому они всегда являются указателями.

товара:

Что делать, если я сказал вам, чтобы написать мне функцию, чтение файла, а затем выбежала другую функцию, когда это было сделано. Однако эта другая функция была неизвестна и будет добавлена ​​другими людьми, людьми, которых я даже не знал.

Для этого у нас есть «обратный вызов». Вы должны написать функцию, которая выглядит так:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *)); 

Этот последний аргумент является указателем на функцию. Когда кто-то называет функцию, которую вы написали, что они делают что-то вроде этого:

void MyDataFunction(char *dataToProcess); 

ReadAndCallBack(myFile, 1024, 0, MyDataFunction); 

товара:

Передача указателя в качестве аргумента функции является наиболее распространенным способом возвращения нескольких значений из функции , В библиотеках Carbon OSX почти все функции библиотеки возвращают статус ошибки, что создает проблему, если библиотечная функция должна вернуть что-то полезное программисту. Таким образом, вы передаете адрес, где вы хотели бы функцию к информации руки обратно к вам ...

int size = 0; 
int error = GetFileSize(afilePath,&size); 

Если вызов функции возвращает ошибку, то в error, если не было ошибок, error, вероятно, ноль и size будет содержать то, что нам нужно.

+0

Что, если бы я сказал вам, что ни один лиз этого ответа не был в ObjC? (конечно, с сохранением распределения кучи) – CodaFi

+0

Я признаю, что я никогда не понимал указателей на первые несколько месяцев с Objective-C, и мне пришлось изучать простой C, чтобы на самом деле заманить концепцию. – iluvcapra

-1

Самое большое преимущество указателей в Objective-C или на любом языке с динамическим распределением состоит в том, что ваша программа может обрабатывать больше элементов, чем имена, которые вы изобретаете в своем исходном коде.

+0

Извините, но это не имеет большого смысла. как указатель влияет на имена переменных? как вы смешиваете указатель с массивами? – vikingosegundo

Смежные вопросы