Как именно возвращаемые структуры работают в Objective-C? - PullRequest
3 голосов
/ 06 августа 2011

Скажем, у меня есть следующая функция, которая возвращает CLLocationCoordinate2D, то есть просто struct, в котором есть два double с (именованные longitude и latitude):

- (CLLocationCoordinate2D)getCoordinateForHouse:(House *)house
{
    CLLocationCoordinate2D coordToReturn;
    coordToReturn.latitude = // get house's latitude somehow
    coordToReturn.longitude = // get house's longitude somehow

    return coordToReturn;
}

Могу ли я в основном относиться к этому struct так же, как к любому другому примитивному типу?Например, если я вызову приведенную выше функцию в коде где-то еще, например:

CLLocationCoordinate2D houseCoord = 
       [someClassThatTheAboveFunctionIsDefinedIn getCoordinatesForHouse:myHouse];

Значение, которое было возвращено из функции, просто копируется в houseCoord (точно так же, как любой другой примитив будет действовать),право?Мне не нужно беспокоиться о том, что CLLocationCoordinate2D когда-либо будет уничтожено где-то еще?

Теперь мне кажется очевидным, что это, вероятно, так, но мне просто нужно подтверждение.

Ответы [ 3 ]

5 голосов
/ 06 августа 2011

Это область, в которой Objective-C наследует свое поведение непосредственно от C - назначение структур приводит к поверхностной копии. Так что если у вас есть какие-либо указатели внутри структур, вы скопируете указатель, а не указанную вещь. В коде C вам необходимо учитывать это в ваших специальных правилах о владении. В Objective-C компилятор автоматического подсчета ссылок не способен работать со ссылками на объекты внутри структур (или, я думаю, союзов), поэтому разумно не слишком привязываться к идее в любом случае.

1 голос
/ 06 августа 2011

Да, именно так вы обрабатываете возвращаемые структуры.Когда вы используете метод, который возвращает структуру, компилятор изменяет ее так, что он фактически возвращает void, и добавляет новый первый аргумент, который является указателем на структуру, в которой должен быть сохранен результат. Итак, ваш метод компилируетсябольше похоже на это:

- (void):(CLLocationCoordinate2D*)returnValue getCoordinateForHouse:(House *)house
{
    CLLocationCoordinate2D coordToReturn;
    coordToReturn.latitude = // get house's latitude somehow
    coordToReturn.longitude = // get house's longitude somehow

    returnValue->latitude = coordToReturn.latitude;
    returnValue->longitude = coordToReturn.longitude;
}
1 голос
/ 06 августа 2011

Вы правы. Если вы просматриваете документацию, вы увидите:

typedef double CLLocationDegrees;

typedef struct {
   CLLocationDegrees latitude;
   CLLocationDegrees longitude;
} CLLocationCoordinate2D;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...