2011-11-03 65 views
0

我使用ARC,爲ASIHTTPRequest-Files我有特殊的編譯器鏈接器標誌,所以他們不使用ARC。現在我創建一個ASIHTTPRequest這樣的:如何停止ASIHTTPRequest(使用ARC)?

...

@屬性(非原子,強)ASIFormDataRequest *請求;

@syntesize要求

...

self.request = [[ASIFormDataRequest alloc]initWithURL:[NSURL URLWithString:API3]]; 
self.request.delegate=self; 
[self.request startAsynchronous]; 

如果請求結束前視圖關閉,我得到一個EXEC_BAD_ACCESS,因爲視圖已經釋放。如果我叫

[self.request獲取clearDelegateAndCancel]

請求並沒有停止和App仍繼續崩潰。 我試着在主線程和performSelector afterDelay上調用clearDelegateAndCancel,但得到相同的結果。 當我啓用ASIHTTPRequest的LOG輸出時,我看到調用的方法,以及ASIHTTPRequest.m中的內部函數[self cancel]被調用,但請求沒有停止,我看到它是因爲網絡活動指示符。

有沒有其他人有這個問題,或知道如何解決?

回答

2

這可能是因爲您的viewcontroller,即ASI委託,不是由ASI作爲弧弱指針管理的,因此在viewcontroller被取消分配時不會自動更新爲nil。 您應該實現的dealloc在弧形的ViewController以防止ASI從回調到不存在的委託(在視圖 - 控制)

- (void)dealloc 
{ 
    [request clearDelegatesAndCancel]; 
} 

即使viewDidUnload應該取消ASI要求,因此零委託

- (void)viewDidUnload 
{ 
    [self.request clearDelegatesAndCancel]; 
    self.request = nil; 

    [super viewDidUnload]; 
} 
2

您可以禁用該類的ARC

當您遷移項目以使用ARC時,編譯器標誌將被設置爲默認值將Objective-C源文件。您可以使用該類的-fno-objc-arc編譯器標誌對禁用ARC的特定類。

在Xcode中,進入目標Build Phases tab>打開Compile Sources group揭示源文件列表>雙擊您要設置標誌的文件>在彈出的輸入-fno-objc弧面板,然後單擊完成。