Добавление @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