iPhone - загрузка нового вида и освобожденного объекта - PullRequest
0 голосов
/ 20 января 2011

Так что сейчас я чувствую себя серьезным новичком, но у меня есть проблема, которую я не могу решить.У меня есть приложение barebones, в котором буквально ничего нет, кроме экрана входа в систему и второго представления, содержащего представление таблицы.Когда я добавляю второе представление после входа в систему (я делал это как 4 раза раньше ...), табличное представление проходит через своих делегатов и кажется, что оно собирается загрузить, но что-то происходит.Я включил свои NSZombies, и он, кажется, освобождает новый вид, прямо перед его появлением.

После прохождения через нее и повторного создания ее, кажется, это происходит после того, как я связываю таблицу с представлением как источник данных / делегат в IB.Я установил представление как UITableViewDelegate, и методы действительно запускаются.Кто-нибудь знает, что может быть причиной такого поведения?

Ответы [ 2 ]

1 голос
/ 21 января 2011

Вы добавили «второе» представление в существующее представление, используя addSubview: или добавили его в какую-либо форму UINavigationController или UITabBarController? Когда вы сделаете это, он автоматически увеличит количество сохраняемых данных, и любой код, который вы выпускаете, не вызовет, должен быть освобожден.

В моем приложении AppDelegate: didFinishLaunchingWithOptions У меня есть что-то вроде;

LoginViewController *login = [[LoginViewController alloc] init];    
[login setDelegate:self];

loginNavController = [[UINavigationController alloc]      
                       initWithRootViewController:login];

[window addSubview:[loginNavController view]];

И затем, когда вход в систему произошел (и с помощью протокола / делегата удалось отправить сообщение обратно в AppDelegate), я вызываю этот код;

UIViewController *newView1 = [[UIViewController alloc] init];
UIViewController *newView2 = [[UIViewController alloc] init];
UIViewController *newView3 = [[UIViewController alloc] init];

myTabBarController = [[UITabBarController alloc] init];

myNavController = [[UINavigationController alloc] 
                     initWithRootViewController:newView1];

// nav controller now retaining
[newView1 release];

NSArray *viewControllers = [NSArray arrayWithObjects:myNavController, 
                                                     newView2, 
                                                     newView3, 
                                                     nil];

[myTabBarController setViewControllers:viewControllers animated:YES];   
[[myTabBarController view] setFrame:[[UIScreen mainScreen] applicationFrame]];

[window addSubview:[tabBarController view]];    

// tab bar controller now retaining
[newView2 release];
[newView3 release];

// remove login from application
[[loginNavController view] removeFromSuperview];

AppDelegate имеет следующее объявленное в заголовочном файле:

LoginViewController *loginViewController;
UITabBarController *myTabBarController;
UINavigationController *myNavController;

В методе dealloc для AppDelegate они освобождаются.

Это дает мне мою страницу входа в систему, а затем, когда она обработает мои представления с помощью верхней навигационной панели, все управляется с помощью нижней панели вкладок.

Надеюсь, это поможет каким-то образом.

0 голосов
/ 21 января 2011

У вас слишком много вызовов release (или autorelease) - или недостаточно вызовов retain - в вашем коде загрузки / перехода, но невозможно быть более конкретным, не увидев этот код.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...