Нужно ли освобождать этот объект? - PullRequest
0 голосов
/ 31 мая 2011

Должен ли я освобождать переменную returnSet?

NSMutableSet* returnSet = [[NSMutableSet alloc] init];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [NSSet setWithSet:returnSet];

Спасибо за ваши ответы, Christian

Ответы [ 6 ]

4 голосов
/ 31 мая 2011

Обычно при написании метода, который возвращает вновь созданный объект (как в вашем примере), вы должны возвращать автоматически освобожденный объект. Таким образом, в соответствии с соглашением, ваш код будет выглядеть так:

NSMutableSet* returnSet = [[NSMutableSet alloc] init];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [returnSet autorelease];

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

Обновление Чтобы устранить некоторую путаницу в правильности этого ответа, обратитесь к разделу «Возвращение объектов из методов» по ​​адресу http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html.

3 голосов
/ 31 мая 2011

Да.В общем, если вы alloc это, вам нужно либо release это, либо autorelease это.

2 голосов
/ 31 мая 2011

Да, вы распределили его (вы им владеете), поэтому вам нужно освободить его.

1 голос
/ 31 мая 2011

Да.Это утечка памяти.Вам нужно создать переменную результата NSSet, освободить returnSet и вернуть результаты.

0 голосов
/ 31 мая 2011

@ bensnider абсолютно корректен - возвращает автоматически освобожденный объект.

Однако я лично предпочитаю вернуть неизменный комплект для предотвращения несчастных случаев позже:)

Я бы хотел написать это:

NSMutableSet *returnSet = [[NSMutableSet set];
    for (Information* currentInformation in self.information) {
        if ([currentInformation.player isEqual:aPlayer]) {
            [returnSet addObject:currentInformation];
    }
}
return [NSSet setWithSet:returnSet];

Затем resultSet создается с неявным автоматическим выпуском, поэтому вам не нужно об этом беспокоиться, и вы возвращаете неизменный объект.

(хотя недостатком этого является то, что вы делаете два набора - возможно, это не проблема, но если этот метод вызывается много раз, вы, возможно, захотите переосмыслить мой ответ!)

0 голосов
/ 31 мая 2011

Да, вы делаете.Вы можете сделать простой автоматический выпуск, например, так:

[returnSet autorelease];
return returnSet;

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

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