想象三個類。 ClassA和ClassB是我的。第三類是一個UIViewController其代碼我不能修改:如何最好地保留委託給ARC的自我?
在ClassA的:
- (void) aMethod
{
ClassB *classBInstance = [[[ClassB alloc] init] goWithOptions:options];
}
ClassBInstance
保留只爲aMethod
壽命。
在ClassB的:
- (void) goWithOptions
{
AUIViewController *avcInstance = [[AUIViewController alloc] init];
avcInstance.delegate = self;
[viewController pushViewController:avcInstance animated: YES]; // this returns immediately, but we need self to be retained until the delegate is done with it
}
- (void) cleanupCalledByDelegate //
{
// cleanup
}
當-goWithOptions
方法被調用,avcInstance
由被叫方保留,但自,其被傳遞給delegate
不是。這意味着只要-goWithOptions
返回,並且aMethod
完成,那麼classBInstance
被釋放,並且delegate
對於avcInstance
不再有效。
理想情況下,我想將classBInstance
(自己在ClassB中)的所有權與avcInstance
;當avcInstance
獲得釋放時,則classBInstance
或委託人被釋放。
或者,我可以清除classBInstance
中的 - cleanupCalledByDelegate
,這是在avcInstance
發佈之前調用的。
如何最好地處理這個問題?我寧願不將ClassB *classBInstance
作爲ClassA的一個屬性,因爲那樣我就不得不讓它釋放classBInstance
,我寧願在ClassB中處理它。如果這是最好的解決辦法,我會用蓋帽和ClassA的,通過完成塊:
{
classBInstance = nil;
}
到-goWithOptions
,我會在-cleanupCalledByDelegate
調用。這是處理這個問題的正確方法嗎?
弧的缺點之一是你沒有太多的控制。保留/釋放現在綁定到屬性。要保留/發佈某些內容,您必須添加其他媒體資源。 –
@JustinMeiners - 不只是屬性。強大的艾瓦爾,範圍和協會。 – TomSwift
@TomSwift對,就是說,它現在綁定到一個命名變量,這使得解決這類問題變得更加麻煩。 –