0

У меня есть аргумент с моим членом команды относительно popToViewController.Правильный способ вызова popToViewController - iOS

Для меня лучший подход Can i pop to Specific ViewController?

Но он думает, что мы должны создать статический экземпляр ViewController, а затем вызвать

-(void)takeToPreviousViewController { 
    if([IVPreviousViewController sharedInstance]) { 
     [self.navigationController popToViewController:[IVPreviousViewController sharedInstance] animated:YES]; 
    } 
} 

Я сильно соединять этот подход, поскольку мы создаем открытый метод в IVPreviousViewController, который не имеет отношения к currentViewController. Мы всегда должны избегать метода, как показано на рисунке.

Может ли кто-нибудь указать мне надежную причину наилучшего подхода.

Update:

IVPreviousViewController.h

__weak static IVPreviousViewController * staticEventDetailViewController; 

    +(IVPreviousViewController *)sharedInstance; 

IVPreviousViewController.m

+(IVPreviousViewController *)sharedInstance { 
    return staticEventDetailViewController; 
} 

Причина такого подхода - В конкретном случае использования в нашем ViewController он должен popbackto IVPreviousViewController

ответ

2

Это мой вопрос:

Я поддерживаю ваше мнение. Мы должны избегать статических общих экземпляров, где это возможно. Статические экземпляры остаются в памяти до времени жизни приложения. Все остальные объекты, ссылающиеся на этот экземпляр, также остаются в памяти.

При использовании подхода, упомянутого выше, общая связь VC, которая больше не нужна, будет снята с памяти. Кроме того, если у вас не так много VC, лучше иметь слабую ссылку на целевую VC из исходного VC вместо цикла и выбора целевого VC.

И да, в контексте объектива C для лучшей читаемости заголовочный файл должен содержать только те API, которые действительно необходимы внешнему миру.

+0

эй @Abhinav я добавил некоторые более обновления в моем вопросе. Дайте мне знать, если у вас есть более глубокое понимание. VC никогда не останется в памяти, потому что он создал __weak static. Но я все еще думаю, что это не лучший подход. – Tariq

+0

Как я уже сказал, всегда избегайте синглтона, особенно в этом случае мы теряем больше, чем выигрыш. Функциональность может быть достигнута путем слабой ссылки на «IVPreviousViewController». Не нужно хранить 'IVPreviousViewController' всегда в памяти. Запустите приложение на инструментах, и это сделает его более понятным. – Abhinav

+0

Эй @ Абхинав, Извините, что привел вас в нашу ссору :) Мы используем статический слабый указатель для ссылки на IVPreviousViewController. Итак, любые предложения/идеи о том, почему бы не использовать слабый указатель? – Shashank

1

Я думаю, что вы можете сделать что-то вроде этого

-(void)popToVC:(ClassNameOfTheViewController)controllerClass{ 
for(UIViewController *vc in self.navigationController.viewControllers) 
    if([vc isKindOfClass:[controllerClass class]]){ 
    [self.navigationController popToViewController:vc animated:YES]; 
    } 
}