2015-03-27 2 views
0

У меня есть элемент управления, который работает следующим образом:Сохранить объект без использования свойства

MyCustomControl *control = [[MyCustomControl alloc] initWithNavigationController:self.navigationController]; 

control.completion = ^{ 
    [self controlCompletedAction]; 
}; 

[control showFromView:self.view]; 

Однако, так как он не сохранили ничем, управление получает плохой доступ при попытке вызвать некоторые методы.

Сохраняя контроль в свойстве класса вызывающему работает отлично, например:

@property(nonatomic, strong) MyCustomControl *control; 

или

@interface MyViewController { 
    MyCustomControl *control; 
} 

оба работают нормально.

Однако я бы предпочел не добавлять свойства для каждого отдельного элемента управления, который я делаю. Целью управления является разделение функциональности, чтобы избежать массивных контроллеров просмотра. Свойство не несет ответственности за что-либо еще в контроллере представления, поэтому нет причин держать его вокруг.

Итак, есть ли способ, чтобы сохранить контроль над не используя свойство/Ивар или прибегая к ObjC выполнения?

+0

Какие методы получают плохой доступ? Можете ли вы опубликовать код, где он сбой? –

+0

Кстати, сохранить следует заменить сильным (сохранить pre-ARC) –

ответ

0

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

@interface YourClass { 
    MyCustomControl *control; 
} 
0

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

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

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

Если мои предложения не имеют для вас смысла, можете ли вы предоставить больше информации о самом контроле?

+0

Элемент управления необязательно добавляется в иерархию вызывающего вида. Целью управления является разделение функциональности, чтобы избежать массивных контроллеров просмотра. Свойство не несет ответственности за что-либо еще в контроллере представления, поэтому нет причин держать его вокруг. – ebi

0

Вы можете использовать переменную static внутри вашего настраиваемого класса управления, но только если есть только один экземпляр MyCustomControl в то же время (например, popover, но даже для него требуется сильная переменная). Пример кода:

// MyCustomControl.m 

static MyCustomControl * _currentInstance = nil; 

-(void)showFromView:(UIView *)fromView 

{ [_currentInstance dismiss]; 

// show code here ... 

_currentInstance = self; 

} 

- (void)dismiss 

{ // remove your control 

_currentInstance = nil; 

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