2011-05-24 61 views
-1

我目前正試圖從互聯網加載圖像。這是我做什麼(我把它從蘋果的LazyTableImages演示項目):從URL加載UIImage時發生奇怪的崩潰

#pragma mark - Download 

- (void)startImageDownload 
{ 
    activeDownload = [[NSMutableData alloc] init]; 
    // alloc+init and start an NSURLConnection; release on completion/failure 
    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:NSURLRequest requestWithURL:[NSURL URLWithString:@"http://pixelpainter.wannerbrothers.net/images/5.png"]] delegate:self]; 
    imageConnection = conn; 
    [conn release]; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [activeDownload appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    // Clear the activeDownload property to allow later attempts 
    activeDownload = nil; 

    // Release the connection now that it's finished 
    imageConnection = nil; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    UIImage *_image = [[UIImage alloc] initWithData:activeDownload]; 
    image_.image = _image; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [self startImageDownload]; 
    [super viewDidLoad]; 
} 

在的情況下,圖像加載約50%,一切工作正常。但大多數情況下,應用程序只是崩潰而沒有任何線索(沒有引發NSException),它只是得到一個SIGABRT。 可能是什麼問題?謝謝!

+0

你能告訴我們它崩潰? – edo42 2011-05-24 15:22:25

+1

爲什麼不在調試器下運行該程序,以便正確地看到有問題的語句和堆棧跟蹤。 – sergio 2011-05-24 15:23:30

+0

有時,它在main()函數中崩潰,有時在「objc_msgSend_disassembly_0x015ca0b0.nasm」 – 2011-05-24 16:02:30

回答

3

對於這三個行:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:NSURLRequest requestWithURL:[NSURL URLWithString:@"http://pixelpainter.wannerbrothers.net/images/5.png"]] delegate:self]; 
imageConnection = conn; 
[conn release]; 

首先,你初始化一個NSURLConnection對象,並conn指向它。然後你指定imageConnection指向同一個對象。最後,你釋放對象。

讓我問一個問題,對象imageConnection是指向還是不存在?崩潰問題的解決方案是確保對象在startImageDownload 方法退出時保留在內存中,因爲您仍然有指向它的imageConnection

編輯:

嘗試改變第二行:

imageConnection = [conn retain]; 

而且不要忘記釋放imageConnection在dealloc

+0

你的意思是「對象imageConnection指向仍然存在或沒有?」?無論如何,我不認爲你指出的代碼有什麼問題,因爲Apple在他們的演示項目中使用它。 – 2011-05-24 16:05:44

+0

@Joel嘗試將第二行更改爲'imageConnection = [conn retain];'並重新測試該應用程序。結果回來(崩潰發生或沒有),我們會從那裏繼續。 – Lukman 2011-05-24 16:08:50

+0

@Joel:不,他們沒有。他們正在分配給一個保留的財產。您正在分配給一個實例變量。閱讀[內存管理編程指南](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html)。 – Jim 2011-05-24 16:10:55

0

你的問題可能是以下幾點,就初始化連接,那麼你立即釋放它。你或許應該只釋放後,要麼成功下載(-connectionDidFinishLoading:)連接或下載失敗後(-connection:didFailWithError:

+0

但我不釋放連接,我將對象 conn 分配給一個屬性,然後釋放它,但是我的屬性仍然留在內存中,不是嗎? – 2011-05-24 16:09:40

+0

僅當您使用setter時:'self.imageConnection = conn'。或者更好的是,跳過整個'conn'並直接指定到'self.imageConnection' – 2011-05-24 16:12:24

+0

試過了,但是沒有幫助... – 2011-05-24 16:14:51