2011-12-13 68 views
0

我需要幫助。 我正在創建一些ASIHTTPRequests,但它有時會崩潰。ASIHTTPRequest初始化

我發現,它是由於初始化。 我必須用這樣的代碼:

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myURL]; 
{my code} 
[request release]; 

或本:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:myURL]; 

你能告訴區別嗎?

PS: 我有十個請求,開始在一個時間,一個,這之前開始。

+0

發佈你的完整代碼以獲得更好的答案。 –

回答

3

第一個是標準分配,而第二個意味着返回autorelease d對象的類方法。

假設您在控制器(或viewController)內部有此代碼,則在方法結束時,request對象可能會被釋放。 所以你需要在你的控制器中保留對這個對象的引用,這樣它纔不會被釋放。

所以,你的接口定義:

@interface MyController : UIViewController { 
    ASIHTTPRequest *request; 
    // ... 
} 

@property (nonatomic, retain) ASIHTTPRequest *request; 

@end 

然後實施

@implementation MyController 

@sinthetyze request; 

- (void) aMethodThatInstantiatesYourRequest { // using self.request means that we use the accessory method, which involves a retain call 
    self.request = [[ASIHTTPRequest alloc] initWithURL:myURL]; 
    // ... 
    [request release]; 

    // or using the autoreleased object 
    self.request = [ASIHTTPRequest requestWithURL:myURL]; 
} 

- (void) dealloc { // don't forget to release the request object 
    [request release]; 
    [super release]; 
} 

順便說一句,如果你有一個以上的要求,這將是更好地使用網絡隊列,因此您保留對隊列的引用,而不是針對各種單個請求。

See this gist,它使用ASINetworkQueue

+0

非常感謝。我沒有崩潰,它比以前更快。 – werbary

0

您可以在查看源代碼後找到差異。

第一部分:需要釋放請求手動對象,但這樣會比第二類型更穩定。

第二部分:創建請求使用autorelease方法。這將在大多數時間正常工作。

如果您的應用程序需要處理大量請求alloc和釋放,強烈推薦使用第一種方式來創建ASI請求。