Разница между объектом и указателем - PullRequest
0 голосов
/ 19 ноября 2011

как гласит заголовок, в чем разница между указателем и объектом.

Скажем, у меня есть этот код ..

NSString *red = [[NSString alloc]initWithFormat:@"%@"];

и этот код ..

NSString *blue = [NSString stringWithFormat:@"%@"];

Правильно ли предположить, что они оба являются указателями на объекти почти так же?И если так, как я должен думать об объектах в моем уме?

Я извиняюсь, если ответ уже существует, я использовал функцию поиска, но я нашел только примеры этого в языке C ++ и хотелчтобы убедиться, как это было в объективе-c.

Ответы [ 7 ]

3 голосов
/ 19 ноября 2011

В дополнение к ответу Василия Старынкевича и Брэма

В задаче C разница между строкой кода равна

NSString *red = [[NSString alloc]initWithFormat:@"%@"];

** Над кодом написано, что вы владеете красным объектом, поэтому вы обязаны его выпустить.

NSString *blue = [NSString stringWithFormat:@"%@"];

** Вы не владеете этим, кто-то другой в вашей программе глубоко внутри будет владеть этим, и вам не нужно выпускать это.

Я бы посоветовал для получения дополнительной информации читать документацию Apple, ОТЛИЧНО! Специально изучаем, "Руководство по программированию Objective C"

Удачи!

PS : в iOS 5 появилась новая функция, управление памятью осуществляется самой iOS, теперь разработчик может быть более креативным, вместо этого он использует 3 класс математики подсчета ссылок:)

2 голосов
/ 19 ноября 2011

Указатели - это концепция C, и они идентичны в C, C ++ и Objective-C. Это просто целое число, которое содержит адрес памяти, где хранится объект. В вашем примере оба этих сообщения динамически создают объект NSString . Где этот объект хранится в памяти вашего приложения, зависит от операционной системы, и вам все равно. Таким образом, ОС выделяет некоторую память и сохраняет в ней экземпляр NSString. Затем он возвращает вам указатель на этот объект, который вы можете использовать для ссылки на фактический объект в более позднее время.

1 голос
/ 19 ноября 2011

Указатель содержит адрес в памяти, где хранится объект.

              Memory address    Object
              --------------    ---------
              0
              1
              2
              3
              4
              ...
pointer ----> 10523             myObject1
              10524
              ...
1 голос
/ 19 ноября 2011

Объект является экземпляром класса.Он занимает память и должен быть освобожден, когда вы закончите с ним.Указатель - это ваша ссылка на объект.

NSString *red = [[NSString alloc]initWithString:@"red"];

и этот код.

NSString *blue = [NSString stringWithString:@"blue"];

красный и синий оба являются указателями на разные объекты.Разница в важности заключается в том, что красный принадлежит вам, а синий не

[[NSString alloc] initWithString: @ "red"]; z

возвращает объект, которым вы владеете, и долженвыпуск позже

[NSString stringWithString:@"blue"]; возвращает объект, который не принадлежит вам и будет освобожден при следующем освобождении пула автоматического выпуска

Эти понятия описаны в Objective-CЯзык программирования руководство от apple (я указал вам на конкретный раздел, это огромный документ, но раздел «Объекты, классы и обмен сообщениями» должен быть наиболее полезным для ваших вопросов)

0 голосов
/ 19 ноября 2011

Также не эксперт Objective-C. Вот мое лучшее предположение.

Оба эти типа кажутся указателями. Тем не менее, похоже, что разница в том, что первое (где вы используете alloc) назначает вас ответственным за связанную память.

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

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

Вы, вероятно, найдете много информации, прочитав этот пост: Указатели Objective-C?

Что касается общего определения «объекта» и «указателя»: оба эти типа являются указателями. Один отвечает за память, а другая ОС берет на себя ответственность за вас. Объект просто определяется как экземпляр класса. Указатель - это адрес памяти этого экземпляра.

0 голосов
/ 19 ноября 2011

(я не эксперт по Objective C, но)

Думайте об объектах как о зонах памяти, указатель относится к зоне, но не к этой зоне.

Полная аналогия: номер вашего автомобиля не является вашим автомобилем. Число - это число (составленное из цифр или, более абстрактно, элемент множества натуральных чисел). Вы едете на машине.

0 голосов
/ 19 ноября 2011

Надеюсь, я смогу сделать это abit более понятным.

объект находится в памяти.указатель подобен стрелке в память, где находится объект.

воспринимайте его как знак направления здания ... здание - это объект, направления - указатели.

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