Ответ 1
Во-первых, правильно ли я прочитал ваш код, что ваш UITableView
не определен в @interface
? Если это так, вы определили myTable
как глобальную переменную. Это не очень хорошая идея, хотя я удивлен, что компоновщик не жаловался, если вы использовали одну и ту же глобальную переменную в двух файлах .m(но это, безусловно, объясняло бы, почему использование одного и того же имени вызвало проблемы). Вы действительно хотите, чтобы ваш UITableView
был переменной экземпляра. Вы можете определить переменную частного экземпляра в верхней части вашего .m файла следующим образом (поместите это перед @implementation
):
@interface MyProfileViewController ()
{
UITableView* _myTable;
}
@end
Если вы это сделаете, то не имеет значения, будет ли имя вашей переменной экземпляра в одном классе быть таким же, как в другом классе. Объем переменной экземпляра класса ограничен этим классом. (Кстати, в стиле, многие люди предисловивают свои переменные экземпляра класса с подчеркиваниями, как правило, чтобы отличать их от свойств класса и локальных переменных.)
Второй (и не связанный с вашим исходным вопросом), я предлагаю высвободить в viewDidLoad
, таким образом:
- (void)viewDidLoad {
[super viewDidLoad];
_myTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStyleGrouped];
[_myTable setDataSource:self];
[_myTable setDelegate:self];
[self.view addSubview:_myTable];
[_myTable release];
}
(И, очевидно, удалите оператор release
из вашего dealloc
.)
Нет причин откладывать release
: когда вы выделяете /init, у него есть счет сохранения +1, когда вы addSubview
получаете счетчик +2, а когда вы отпускаете, вы просто возвращаетесь релиз возвращается к +1 (это означает, что он не будет отменен, потому что self.view
сохраняет его, но когда представление в конечном итоге освободит его, ваше табличное представление будет автоматически отменено для вас). Тем не менее, есть веские причины не откладывать его (ваш исходный код будет протекать, если вы получили didReceiveMemoryWarning
после нажатия на новый контроллер представления).
Если вы используете ARC, эта проблема глупого управления памятью обычно очищается для вас, но, учитывая, что вы не используете ARC, вам может потребоваться настроить, где вы отпустите.