Objective-C: объекты передаются по значению? - PullRequest
1 голос
/ 31 января 2012

Я знаю, что раньше об этом спрашивали под разными углами.
Однако я пока не увидел прямого ответа, как явные объекты передаются в target-c.После месяца опыта кодирования в цели c (из Java) я вижу, что объекты передаются по значению.Это правда?

В моем коде у меня был NSArray объектов типа Person.Я взял один из объектов из NSArray, отредактировал его и увидел, что значения любых объектов в NSArray не изменились, пока я не вызвал replaceObjectAtIndex: метод.К моему удивлению, этот сценарий показал мне, что явные объекты в Objective C передаются по значению.

Ответы [ 3 ]

2 голосов
/ 31 января 2012

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

Хотя в Objective-C существует два типа литералов объектов: строки и блоки, ипоследним из них разрешено жить в стеке, а не в куче, он по-прежнему обрабатывается по ссылке.

Выполненный вами тест должен быть каким-то образом некорректным.

0 голосов
/ 31 января 2012

В вашем тесте произошла какая-то ошибка.

NSMutableString *string = [@"foo" mutableCopy];
NSArray *array = [NSArray arrayWithObject:string];
[string appendString:@"bar"];
NSLog(@"%@", array);


> [...] (
>     foobar
> )

В Objective-C на все объекты всегда ссылается указатель.

0 голосов
/ 31 января 2012

Все передается по значению в C, просто некоторые из этих значений являются указателями. Передача указателя позволяет вам просто передать «указатель» целевому объекту, а не самому объекту. Вы управляете объектом, следуя указателям; любой, кто держит указатель на тот же объект, увидит изменения, внесенные в него любым другим кодом.

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

NSArray *myArray = ...;
id element = [myArray objectAtIndex:n];
element.foo = @"Bar";

// [[myArray objectAtIndex:n] foo] is now "Bar";

Какой у вас был тестовый код?

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