2015-07-16 1 views
0

Скажем в прошивкой мы имеем:RetainCycle с Globals

В W2AppDelegate.m:

 
GlobalViewController *globalVc; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
... 

} 

В SomeOtherViewController.m:

 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [globalVc doSomething^{ 
     [globalVc.someVariable doSomethingElse]; // Is there a retain cycle here? 
    }]; 
} 

Есть ли сохранить цикл здесь, так как мы имеем сильная ссылка на globalVc внутри блока.

globalVc -> блок -> globalVc

+1

Я думаю, что все ниже говорят, что это: «globalVc -> block -> globalVc» - это цикл, но это зависит от: «globalVc -> block» является истинным в вашем коде, что неясно из вопроса. – danh

ответ

1

Игнорирование плохой дизайн - это зависит от многого.

Если вы храните блок в Ивар и блок ссылается на объект, что Ивар на то вы действительно получите сохранить цикл - см ниже:

enter image description here

Если вы на самом деле не магазин блок, но вы вместо того, чтобы просто вызова блока, то вы будете в конечном итоге с возможностью того, что никаких дополнительных не оставляете берется вообще - смотри ниже

enter image description here


Неясно, является ли ваш GlobalViewController синглом или просто глобальной ссылкой, которую можно обновить. Если это синглтон, то удержание циклов вызывает меньше беспокойства, так как вы ожидаете, что объект будет жить в течение жизни программы в любом случае.

+0

globalViewController - одноэлементный в этом случае. –

+0

Тогда технически цикл сохранения не является проблемой, поскольку синглтон будет жить в течение всей жизни программы. Но важно понимать, когда/почему могут быть сохранены циклы, так как это неправильная практика имеет циклы –

+0

, так что технически существует цикл сохранения, независимо от того, является ли это проблемой? –

1

Вы определили переменную globalVc как глобальную переменную в своем делете приложения. A Когда вы создаете GlobalViewController, он будет сохраняться для вашего приложения. Иногда вы хотите, чтобы контроллер просмотра сохранялся навсегда.

Это не цикл сохранения, но он привязывает память к жизни вашего приложения.

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

Иногда я создаю Singleton Utils, который я использую для предоставления общих функций утилиты приложения. Я пишу функцию доступа, такую ​​как

+(Utils *) sharedUtils; 

Это возвращает указатель на однотонный Utils. Это чище, чем использование глобального, как вы делаете.

3

Здесь есть цикл удержания, поскольку мы имеем сильную ссылку на globalVc внутри блока.

Нет. Поскольку блоки фиксируют только локальные переменные.

[globalVc doSomething^{ 
    [globalVc.someVariable doSomethingElse]; // Is there a retain cycle here? 
}]; 

globalVc не был захвачен блоком, поскольку globalVc является глобальной переменной. Здесь нет локальных переменных, поэтому блок не захватывает никаких объектов. Таким образом, блок не сохраняет никаких объектов вообще.

 Смежные вопросы

  • Нет связанных вопросов^_^