2013-05-18 2 views
0

Я хотел бы знать правильный подход здесь под ARC.ARC от сильного до сильного

У меня есть сильный NSArray (собственный собственный объект класса) @property внутри контроллера, а когда я инициализирую другой контроллер, я должен передать только один NSString из этих массивов в другой указатель контроллера, который является слабым. Но я не так, как мне нужно это быть отсортирован

В главном контроллере

_leftPanelViewController.repotLabels = [[self.availableDashBoards sortedArrayUsingDescriptors:@[sortByReportLabel]]]; 

А другой контроллер имеет

@property(nonatomic, strong)NSArray *repotLabels; 

1), как я понял, 1-й возвращает слабый указатель, который я назначаемые другой слабый указатель, так что если код в mainController выходит за пределы области видимости, мой reportLabel становится «ноль»?

2) Так что если я создаю свойство reportLabels (сильное), это исправить проблему, но есть ли другой подход? Должен ли я также делать что-то вроде этой «копии» в конце?

_leftPanelViewController.repotLabels = [[self.availableDashBoards sortedArrayUsingDescriptors:@[sortByReportLabel]]copy]; 

ответ

2

Я думаю, что может быть некоторая путаница, когда управление памятью опций пинков свойства в. Они влияют только на сеттер а не геттер. Вот краткий обзор с использованием ARC:

сильный - объект сохраняется при установке свойства. Предыдущее значение: освобождено. Это то, что вы хотите использовать с объектами наиболее времени, как вы обычно хотите иметь сохранить ваш Ивар, чтобы они не делали никаких прибудут высвобожден Underneath, это выглядит примерно так:

-(void)setObject:(id)obj 
{ 
    [obj retain]; 
    [_object release]; 
    _object = obj; 
} 

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

-(void)setInteger:(NSInteger)newInt 
{ 
    _nteger = newInt; 
} 

копию - А новый объект того же типа создается и содержимое объекта, переданного в копируются. Это работает только для объектов, которые соответствуют протоколу NSCopying. Обычно вы используете это, когда хотите использовать исходные значения объекта, а затем редактировать исходный объект. (например, если у вас есть NSMutableString, установленный в «Jane», и с помощью этого свойства скопированного свойства свойство будет по-прежнему сообщать «Jane» даже после того, как вы измените исходный код NSMutableStringn на «John»). Под ним это выглядит примерно так:

-(void)setObject:(id)obj 
{ 
    id copy = [obj copy]; 
    [_object release]; 
    _object = copy; 
} 

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

Когда вы пишете object.property = value;, [object setProperty: value]; фактически вызывается за кулисами.

I подозреваемый, который вы хотите использовать, как вы указали. Насколько я могу судить, никакие слабые свойства не вступают в игру в фрагментах кода, которые вы указали, если _leftPanelViewController.repotLabels не является слабым.

+0

Благодарим вас и за ваше последнее утверждение. Да, это было действительно слабое свойство, которое я понял и обозначил как Сильный, но тогда копия не имеет смысла – Gaurav18ca

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