Установка объектного ноля по сравнению с release+realloc

Используйте этот статус. ссылка: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

SELECT * FROM TABLE_shares WHERE DATE_SHARE > DATE_SUB(NOW(), INTERVAL 7 DAY)

9
задан Abizern 14 November 2011 в 09:45
поделиться

6 ответов

Если Вы делаете myArr=nil; отдельно, затем Вы потеряли указатель, к которому можно отправить release сообщение к. Нет никакого волшебства к release Ваш объект.

И, как Georg говорит, не имея возможности выпустить Ваш объект, та память 'просочилась'.

21
ответ дан 4 December 2019 в 06:27
поделиться

Вы могли использовать свойство и получить почти синтаксис, который Вы хотите без утечки памяти.

Используйте этот синтаксис для объявления массива

@property (readwrite, retain) NSMutableArray *myArray;

Затем повторно инициализируйте его как это:

[self setMyArray:[NSMutableArray array]];
6
ответ дан 4 December 2019 в 06:27
поделиться

Если бы Вы были на Mac OS, то не iPhone OS я сказал бы, что это зависит от того, активируется ли сборщик "мусора" или нет:

  • с GC: использовать myArr = nil;
  • без GC: использовать [myArr release];

К сожалению, на iPhone, нет никакой сборки "мусора", поэтому если Вы не хотите утечки памяти, необходимо выпустить объект, после того как Вам больше не нужен он.

5
ответ дан 4 December 2019 в 06:27
поделиться

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

"Выпуск объекта" является "ничем", таким образом, он не делает этого.:) На собравшем "мусор" языке это могло бы сделать это как побочный эффект отбрасывания ссылки, но в Objective C это не прокладывает себе путь.

1
ответ дан 4 December 2019 в 06:27
поделиться

Если то, что Вы хотите, должно сбросить содержание NSMutableArray/NSMutableDictionary, можно также назвать removeAllObjects, и у Вас есть новый array/dict для работы с.

1
ответ дан 4 December 2019 в 06:27
поделиться

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

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Однако это не дает того, чего вы хотите, потому что вы не выпускаете myArr. Если вы синтезировали сеттер для myArr, то вы можете получить желаемое поведение выпуска, установив значение nil, используя сеттер (self.myArr) вместо прямого доступа к указателю (myArr). Полное исправление вашего второго блока:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Теперь у нас есть эквивалентные примеры кода, один использует сеттер с nil для выпуска, а другой нет. Они такие же.

Если myArr - изменяемый массив, как в этих примерах, наиболее эффективный метод - использовать removeAllObjects, избегая всей работы по освобождению памяти только для ее возврата:

[myArr removeAllObjects];
4
ответ дан 4 December 2019 в 06:27
поделиться