Добавление @Property UISwitch в TableView вызывает проблемы с RetainCount

Я делаю это с UISwitchs и UITextFields...

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

Я добавляю UISwitch к одному из моих TableViewCells, используя следующий код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;
mySwitch.on = YES;

return cell;

} 

Как есть, retainCounts повсюду. MySwitch Retain равен 2 к тому времени, когда ячейка была помещена на экран, и каждый раз, когда я нажимаю на переключатель, счетчик удерживания увеличивается, пока не достигнет 4, а затем, кажется, останется там.

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

2 ответа

Решение

Погоня за retainCount объекта - это не то, что вы хотите делать, когда частные API взаимодействуют с ним. Все, что вы хотите сделать, - это отслеживать свои собственные значения сохранения, а затем убедиться, что вы увеличиваете их и уменьшаете по мере необходимости. Предполагая, что у вас есть что-то вроде следующего:

@property (nonatomic, retain) UISwitch *mySwitch;

@synthesize mySwitch;

Вы должны изменить свой код, который у вас есть выше, чтобы он был таким:

self.mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;
mySwitch.on = YES;

В приведенном выше коде вы больше не являетесь владельцем mySwitch, поскольку вы указали его для автоматического выпуска. Однако с помощью self.mySwitch Вы будете сохранять собственность, когда создаете ее там. Затем вы можете использовать его по своему усмотрению на протяжении всей программы. Просто убедитесь, что он безопасно выпущен в dealloc.

1: Никогда, никогда, никогда не обращайте внимания на то, что возвращается retainCount. Это не предназначено, чтобы быть человеческой интерпретируемой ценностью.

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

3: Каждый раз, когда вы вызываете alloc, вам нужен соответствующий релиз (или авто-релиз). В этом случае вы можете позвонить [mySwitch release] после mySwitch.on = YES,

4: стоит периодически пересматривать правила управления памятью для Objective-C. http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

Другие вопросы по тегам