Внутренний указатель / объект автозапуска? - PullRequest
2 голосов
/ 30 декабря 2011

Предположим, у меня есть этот код:

-(SomeOtherType*) getMyObject {
    SomeType someObject = [[SomeType alloc] init];
    // ... later on
    SomeOtherType toReturn = [[[someObject interiorObject] retain] autorelease];
    [someObject release];
    return toReturn;
}

Объект toReturn, правильно ли я его обрабатываю? Я хочу доставить его как autoreleased объект, но я хочу удалить someObject. Это шаблон для передачи права собственности? Я обдумал это в своей голове и на бумаге, и, кажется, все в порядке, но я бы предпочел, чтобы кто-то более образованный сообщил мне.

Редактировать Это очень надуманный пример, просто для иллюстрации проблемы. someObject живет во многих вызовах методов, и, в конце концов, я хочу «выкинуть из себя кишки». Это НЕ Ежедневный пример WTF. Пожалуйста, не высмеивайте меня. :)

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Код, который вы указали в своем вопросе, верен.Давайте рассмотрим почему.Когда вы думаете о сохранении / освобождении, вам нужно подумать о владении.Объекты обычно принадлежат другому объекту или находятся в определенной области видимости.В этом случае область действия getByObject.Объект, который вы хотите вернуть, это interiorObject, который принадлежит someObject.Но вам нужно выпустить someObject, прежде чем вернуться.Правильнее всего сделать так, чтобы стать владельцем interiorObject и вернуть автоматически выпущенную копию.И, наконец, релиз или авто-релиз someObject.

Если владение не было приобретено до interiorObject до выпуска someObject, тогда interiorObject можно было бы освободить, и мы бы вернули висячий указатель.В первый раз, когда кто-то попытается отправить ему сообщение, программа, скорее всего, вылетит.

1 голос
/ 30 декабря 2011

Я не уверен на 100%, что вам нужно танцевать retain / autorelease, если вы не ожидаете, что другой поток потенциально освободит ваш объект?

- (SomeOtherType *)getMyObject
{
    SomeType someObject = [[SomeType alloc] init];
    // ... later on

    SomeOtherType toReturn = [someObject interiorObject];
    [someObject release];
    return toReturn;
}

retain / autorelease Dance гарантирует, что объект висит до конца цикла выполнения, даже если другой поток освобождает его, оставаясь на нем.

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