Добавление @Property UISwitch в TableView вызывает проблемы с RetainCount - PullRequest
0 голосов
/ 17 октября 2010

Я делаю это с 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 ]

1 голос
/ 17 октября 2010

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

@property (nonatomic, retain) UISwitch *mySwitch;

@synthesize mySwitch;

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

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

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

0 голосов
/ 17 октября 2010

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

...