Почему свойство weak delegate моего объекта nil в моих модульных тестах?

У меня довольно простая установка для этого модульного теста. У меня есть класс, который имеет свойство делегата:

@interface MyClass : NSObject
...
@property (nonatomic, weak) id<MyDelegateProtocol> connectionDelegate;
...
@end

и я устанавливаю делегат в своем тесте:

- (void)testMyMethod_WithDelegate {
  id delegate = mockDelegateHelper(); // uses OCMock to create a mock object
  [[delegate expect] someMethod];
  myClassIvar.connectionDelegate = delegate;
  [myClass someOtherMethod];
  STAssertNoThrow([delegate verify], @"should have called someMethod on delegate.");
}

Но делегат фактически не установлен в строке 3 моего модульного теста, поэтому #someMethod никогда не вызывается. Когда я меняю его на

myClassIvar.connectionDelegate = delegate;
STAssertNotNil(myClassIvar.connectionDelegate, @"delegate should not be nil");

- происходит сбой. Я использую ARC, поэтому моя догадка заключалась в том, что слабое свойство было деаллоцировано. Конечно, изменение его на strong делает STAssertNotNil проходящим. Но я не хочу делать этого с делегатом, и я не понимаю, почему это имеет значение в данном случае. Из того, что я читал, все локальные ссылки в ARC являются сильными, и STAssertNotNil(delegate) проходит. Почему свойство моего слабого делегата равно nil, а тот же объект в локальной переменной - нет?

13
задан Adam Stegman 30 December 2011 в 00:45
поделиться