self.string не сохраняет вызывающий утечки памяти iphone - PullRequest
1 голос
/ 30 июня 2011

У меня есть несколько дат и строк, которые объявлены как неатомарные и сохранены.

Когда я устанавливаю дату или изменяю строку с помощью self.string, она не сохраняется. Если я форсирую [string retain], у меня нет проблем, хотя это приводит к утечкам памяти.

Есть идеи или как или что я делаю не так?

Приветствия

Обновление:

    @property (nonatomic, retain)NSDate *time;
    self.time = [cal dateFromComponents:comps];

self.time не сохраняет. Я должен [time retain];

Ответы [ 4 ]

1 голос
/ 30 июня 2011

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

0 голосов
/ 30 июня 2011

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

В Xcode 4 перейдите к продукту / профилю, ваш проект будет скомпилирован и появится окно инструментов. Выберите инструмент Allocations, затем остановите автоматически запущенное выполнение, нажав на красную кнопку, которая выглядит как кнопка REC.

Нажмите маленькую кнопку i перед инструментом Allocations. И выберите «Record Reference Count» и «Enable NSZombie Detection», теперь запустите снова, нажав ту же красную кнопку. Воспроизведите проблему, когда она завершится сбоем, вернитесь в окно «Инструменты», и вы увидите диалоговое окно, нажмите на стрелку и найдите источник проблемы. ИМО, вы должны посмотреть, где ваш объект был выпущен неправильно.

enter image description here

0 голосов
/ 30 июня 2011

Вы синтезировали методы сеттера и геттера? Они синтезируются путем включения следующей строки кода в файл .m:

@synthesize time;

Как правило, вы должны сделать это сразу после строки:

@implementation YourClass

Вот что на самом деле генерирует метод, который сохраняет переменную, когда вы устанавливаете ее, как вы делаете, в:

self.time = [cal dateFromComponents:comps];
0 голосов
/ 30 июня 2011

Рассмотрим последовательность:

0 NSObject *obj = [[NSObject alloc] init];
1 [obj retain]
2 [obj release]
3 [obj release]
4 NSLog("@%@",obj);
5 [obj retain]

потерпит крах в строке 4 (объект был освобожден), а последовательность:

0 NSObject *obj = [[NSObject alloc] init];
1 [obj retain]
2 [obj retain]
3 [obj release]
4 [obj release]
4 NSLog("@%@",obj);

будет утечка (количество сохраняемых объектов равно 1).

Как вы можете видеть, одни и те же операции, но в другом порядке, могут изменить ваш объект с лишнего освобождения на утечку.

...