@property не сохраняет - PullRequest
0 голосов
/ 01 июня 2011

У меня есть свойство с именем data типа NSArray в InventoryFilteredTVC, и вот пример кода:

NSArray *results = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%i", [array retainCount]);
InventoryFilteredTVC *filteredTVC = [[InventoryFilteredTVC alloc] initWithStyle:UITableViewStylePlain];
[filteredTVC setTitle:@"Search Results"];
[filteredTVC setData:results];
NSLog(@"%i", [array retainCount]);

Это возвращает:

1
1

Почему это так?Почему данные не сохраняются?Кроме того, когда я пытаюсь освободить данные в методе dealloc в InventoryFilteredTVC, я получаю сбой, который, очевидно, происходит из-за того, что данные не сохраняются.Что я делаю не так?

РЕДАКТИРОВАТЬ: моя собственность определяется как

@property (nonatomic, retain) NSArray *data;

Ответы [ 3 ]

4 голосов
/ 01 июня 2011

'results' и 'array' - это два разных массива.Возможно, вы сохраняете «результаты», но почему это повлияет на количество сохраненных «массивов»?

Что касается сбоя, убедитесь, что вы не публикуете «результаты» (он уже автоматически выпущен), иубедитесь, что вы используете синтезированный setData: (или вы написали свой собственный setData: который фактически сохраняет данные)

2 голосов
/ 01 июня 2011

Вы почти никогда не должны пытаться понять, удерживать счет Вы просто запутаетесь.

Все, что действительно имеет значение, это то, что вы отпускаете объект столько раз, сколько его удерживали. Вы уверены, что setData: является сохраняемой собственностью? Это синтезированный или заказной? Вы можете опубликовать это?

Вы выводите счет удержания array, но вы передали results в setData:. Это разные объекты. Если вы действительно хотите проверить сохраняемые значения (что, вероятно, не следует), вы должны проверить значение results.

filteredArrayUsingPredicate: возвращает объект автоматического освобождения (вы можете сказать, потому что имя метода не начинается с "alloc", "new", "copy" или "mutableCopy" - см. Документы для получения дополнительной информации). Поэтому вам определенно следует сохранить его, и если setData: действительно является свойством retain, этот код должен работать нормально.

2 голосов
/ 01 июня 2011

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

Когда использовать -retainCount?

Просто используйте инструменты сборки и анализа XCode и инструменты Leaks, чтобы избавиться от ошибок памяти. Не делайте себе слишком много с сохранением счета и т. Д.

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