Apple的開發人員參考指出,如果沒有強引用,則釋放對象。如果從弱引用調用的實例方法處於執行過程中,會發生這種情況嗎?iOS - 執行期間的對象釋放
例如,請考慮下面的代碼片段 -
@interface ExampleObject
- doSomething;
@end
@interface StrongCaller
@property ExampleObject *strong;
@end
@implementation StrongCaller
- initWithExampleInstance:(ExampleObject *) example
{
_strong = example;
}
- doSomething
{
....
[strong doSomething];
....
strong = nil;
....
}
@end
@interface WeakCaller
@property (weak) ExampleObject *weak;
@end
@implementation WeakCaller
- initWithExampleInstance:(ExampleObject *) example
{
_weak = example;
}
- doSomething
{
....
[weak doSomething];
....
}
@end
現在,在主線程,
ExampleObject *object = [[ExampleObject alloc] init];
在線程1,
[[StrongCaller initWithExampleInstance:object] doSomething];
在線程2,
[[WeakCaller initWithExampleInstance:object] doSomething];
假設主線程不再持有對象的引用,如果強[strong doSomething]正在執行時設置爲nil,會發生什麼情況?在這種情況下對象GC'ed?
是的,它可以發生在對象的方法調用的中間。潛在的症狀是相當不可預測的。 –
好的。這怎麼可以避免?此外,這不會使一個弱引用不適合併發編程嗎? –
可以通過在某處保留強有力的參考來避免。 –