2013-04-11 53 views
2

我正在開發一個ARC啓用項目。從視圖控制器我推MyClass的ARC:對象 - 代表關係

- (void)pushMyClass { 
    MyClass *myClass = [[MyClass alloc] init]; 
    [self.navigationController pushViewController:myClass animated:YES]; 
} 

做一些操作,我大跌眼鏡MyClass的經過。這裏的問題是,MyClass沒有被取消分配。以下是課程的外觀。

/* MyHelperClassDelegate */

@protocol MyHelperClassDelegate <NSObject> 
- (void)helperDidFinishHelping:(MyHelperClass *)helper; 
@end 

/* MyHelperClass接口*/

@interface MyHelperClass : NSObject { 
    __weak id <MyHelperDelegate> delegate; 
} 

@property(nonatomic, weak) id<MyHelperDelegate> delegate; 

- (void)startHelping; 

@end 

/* MyHelperClass實施*/

@implementation MyHelperClass 

@synthesize delegate; 

- (void)dealloc { 
    delegate = nil; 
} 

/* MyClass的*/

@interface MyClass : UIViewController <MyHelperClassDelegate> { 
    MyHelperClass *helper; 
} 

@implementation MyClass { 

    - (void)dealloc { 
     helper.delegate = nil; 
    } 

    - (void)getHelp { 
     helper = [MyHelperClass new]; 
     helper.delegate = self; 
     [helper startHelping]; 
    } 

    - (void)helperDidFinishHelping:(MyHelperClass *)helper { 
    } 
} 

MyHelperClass要求使用NSMutalbleURLRequest & NSURLConnection的來獲取一些數據的Web服務,並將其保存到用戶的默認值。

有一點需要注意的是,如果我評論行helper.delegate = self;,那麼MyClass被取消分配。

如何讓MyClass在導航控制器彈出時被取消分配?

謝謝。

+2

您已經包含了很多代碼,這些代碼似乎與您所詢問的這個MyClass實例無關,與此無關。這個MyHelperClass事情與任何事情有什麼關係?我認爲要麼你需要更清楚你的代碼實際在做什麼,或者你需要包含更多相關的代碼。 – Chuck 2013-04-11 17:25:39

+0

如果你拿出'helper.delegate = self'這行,它是否會被釋放?如果行爲沒有改變,那麼問題就在於別的地方。 – 2013-04-11 17:31:23

+0

您是否添加了斷點或nslog語句來釋放以驗證其被調用? – 2013-04-11 18:54:24

回答

2

你的委託代碼看起來是正確的(除了使用ivar,你不會顯示@synthesize,所以你可能有_delegate和委託兩者)。很可能還有別的東西在保留MyClass。我建議你做的是添加一個NSLog到你的MyClass dealloc。然後按下它,然後立即按下後退按鈕,看看它是否被釋放。如果不是,那麼請仔細看看viewDidLoad等人做了什麼,然後開始評論這些代碼的各個部分,直到獲得dealloc。

此外,我假設你不會在推動MyClass對象的類中保留強引用。

+0

嗨@大衛,我編輯了我的問題。請看看能否幫助我。謝謝。 – EmptyStack 2013-04-12 04:29:53

+0

你的答案幫助我到達那裏。另一種觀點是保留我的班級。謝謝。並感謝大家的幫助! – EmptyStack 2013-04-12 12:02:39

1

我同意查克說,不能從提供的代碼中說很多。但MyClass對象未被釋放的一個原因可能是它由您的helper對象保留,因爲delegate被聲明爲strong,並且MyClass對象的屬性helper也被聲明爲強。在這種情況下,你有一個保留週期,並且它們都不能被釋放。

+0

嗨@ReinhardMänner,我編輯了我的問題。請看看能否幫助我。謝謝。 – EmptyStack 2013-04-12 04:29:13

1

訣竅可以您使用NSURLConnection事實中可能說謊。它沒有規定如何使用這個類根據您所提供的代碼,但請注意在NSURLConnection class reference引用的特殊注意事項:

特別注意事項:在下載過程中的連接保持 強引用給代表。當連接完成加載,失敗或取消時,它會釋放該強引用 。