2012-02-24 1 views
8

я определил это в коде:Почему IBOutletCollection указывает на статические ячейки из раскадровки, возвращающей нуль?

@property (nonatomic, weak) IBOutletCollection(UITableViewCell) NSSet * certaintyCells; 

и синтезируются. Я абсолютно уверен, что этот контроллер используется в доске объявлений и подключил три ячейки к этой коллекции.

Далее в вызове метода didSelectRowAtIndexPath:, я добавил этот код, с NSLog добавил для отладки:

 NSLog(@"Certainty Cells: %@",certaintyCells); 
     for (UITableViewCell * cell in certaintyCells) { 
      [cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]]; 
      [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 
     } 

Выход есть это:

Certainty Cells: (null) 

И, конечно же, ожидаемое поведение не бывает.

Любые идеи относительно того, почему это происходит? Я уверен, что я использую статические ячейки, а не динамические прототипы. В качестве дополнительной заметки эти три ячейки также связаны с (рабочими) отдельными IBOutlets.

Спасибо,

ответ

33

Я нашел ответ, сделав изменения, которые не имеют смысла для меня в то время. Я сменил объект с weak на strong, и он сработал.

Почему я был (слабым), в первую очередь:

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

Почему это мышление было неправильно:

Поскольку IBOutletCollection является экземпляром NSSet или NSArray. что NSSet/NSArray не сохраняется в представлении, потому что он сам не является подвью. С IBOutlet слабым свойством является штраф, с IBOutletCollection требуется сильное свойство, в противном случае счетчик ссылок немедленно равен нулю и освобождается.

Я оставляю это здесь в надежде, что это поможет кому-то еще.

+0

Мысли же, не смогли найти ответ в яблочном документе. Изменил его сильным, он работает сейчас. Интересно, удастся ли его получить? – Oritm

+0

Он должен автоматически отключиться, когда диспетчер просмотра отключится, вы можете установить его на nil в viewDidUnload, если вы хотите, чтобы он отключился там. –

3

Я бы сказал, что (null) значение является следствием освобождения объекта, поскольку ARC догадался, что объект не ссылается ни на кого и устанавливает значение nil, а затем освобождает его в какой-то момент.

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