2009-08-08 29 views
5
vấn đề rò rỉ

Memory - NSConcreteDatasử dụng NSData trong iPhone

// to set tip - photo in photo frame  
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:pathOfThumbNail]]; 
UIImage *cellThumbImg; 
if([data length]>0){ cellThumbImg=[UIImage imageWithData:data];} else { cellThumbImg=[UIImage imageNamed:@"130X90.gif"]; } 
UIImageView *imgView=[[UIImageView alloc]initWithImage:cellThumbImg]; imgView.frame=photoFrame; 
(cellThumbImg.size.height>=58 || cellThumbImg.size.width>=58) ? [imgView setContentMode:UIViewContentModeScaleToFill] : [imgView setContentMode:UIViewContentModeCenter] ; 
[cell.contentView addSubview:imgView]; 
[imgView release]; 

câu hỏi của tôi rất giống nhiều cho câu hỏi này,

iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView

Thậm chí, tôi đã thêm mã sau đây để tôi Ứng dụng đã hoàn thành Launching, đưa ra dưới đây. Mã sau đây để thiết lập bộ nhớ sharedCache với dung lượng bằng không. Nó gần như sẽ loại bỏ rò rỉ NSConcreteData trong ứng dụng của tôi. Tuy nhiên rò rỉ bộ nhớ.

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 
[window makeKeyAndVisible]; 
} 

tôi không thể tìm thấy giải pháp nào cho loại câu hỏi này từ tràn ngăn xếp.

Nếu bạn có thể trả lời, tôi sẽ biết ơn bạn.

Xin cảm ơn trước.

+0

Tôi đã theo dõi cách thức như @Bkaenk & @epatelsaid. Tuy nhiên có cùng một vấn đề, như câu hỏi sau đây. http://stackoverflow.com/questions/280053/iphone-memory-leak-nsdata-datawithcontentsofurl-uiwebview –

Trả lời

7

Tôi có vấn đề với điều này cũng như trong dự án lớn của tôi. Sau khi làm việc với một kỹ sư của Apple cố gắng xác định vị trí rò rỉ, cuối cùng anh ta đã hỏi nhóm dev chính của Apple đằng sau NSURLConnection. Họ về cơ bản nói rằng có một bộ nhớ cache nội bộ mà không phải là clearable ở tất cả trong NSURLConnection và nó đã được một vấn đề được biết đến.

Vì vậy, tôi đã tìm kiếm các giải pháp thay thế. Tôi tìm thấy ASIHTTPConnection (liên kết bên dưới) hoạt động ngoài CFNetwork. Nó được thiết kế để trở thành một thay thế drop-in cho NSURLConnection, cộng với một loạt các tính năng tuyệt vời khác như tải xuống đĩa thay vì bộ nhớ, tải xuống tiếp tục, thanh tiến trình gọi lại thanh vv ..

Tôi đã sử dụng nó trong tất cả các dự án của mình và chưa bao giờ có bất kỳ vấn đề hoặc khiếu nại nào. Một câu trả lời cho câu hỏi của bạn, đây là cách tôi thoát khỏi những rò rỉ bộ nhớ đó.

http://allseeing-i.com/ASIHTTPRequest/

+1

Trong khi đây là câu trả lời được chấp nhận và có thể giải quyết vấn đề của OP, tôi bỏ qua giải pháp đơn giản hơn trong câu trả lời của epatel. Câu trả lời của anh ta phải là câu trả lời. – coneybeare

4

Thông báo phát hành của bạn được viết sai chính tả, bạn đã nhập relaese nhưng đó là release. Tôi đoán đó chỉ là một vấn đề trong mã mà bạn đã gõ cho câu hỏi này.

Thứ hai. Bạn không cần thông báo chuỗi alloc init đầu tiên. Tất cả bạn cần là:

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

Cấp, tôi không biết nếu gọi đó là thực sự chính xác, nhưng tôi biết rằng nó sẽ trả về một tính năng tự động phát hành NSData đối tượng có nghĩa là bạn trước alloc init sẽ bị rò rỉ.

+0

@Blaenk - Thưa ngài, Vui lòng xem phần sửa trong Câu hỏi của tôi. Tôi đang gặp vấn đề tương tự. Ngay cả sau khi Áp dụng logic được đề xuất của bạn, tôi cũng đang tìm thấy cùng một vấn đề rò rỉ bộ nhớ. –

10

Bạn có ba dòng, cho phép phá vỡ chúng xuống

1. NSData *imageData = [[NSData alloc] init]; 
2. imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 
3. [imageData release]; 

Dòng 1: phân bổ và init một NSData mới. NSData này sẽ có số tham chiếu của +1

Dòng 2: nhận dữ liệu từ internet và đặt vào NSData. Điều này đặt các biến được sử dụng Line 1 đến NSData mới (được thiết lập để autorelease) ẩn NSData alloced và inited trên Line 1

Dòng 3: sẽ phát hành các NSData nhận trên Line 2.

Bạn có thể loại bỏ dòng 1 và 3 và chỉ cần thêm phần khai báo biến để dòng 2. bởi vì nó là autoreleased nó sẽ được phát hành bởi các eventloop sau ...

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

tôi đề nghị bạn đọc Quản lý Memory phần here

+0

@ePatel - Thưa ngài, hãy xem phần sửa đổi trong Câu hỏi của tôi. Tôi đang gặp vấn đề tương tự. Ngay cả sau khi Áp dụng logic được đề xuất của bạn, tôi cũng đang tìm thấy cùng một vấn đề rò rỉ bộ nhớ. –

+0

Nit: dòng 2 ẩn imageData được chỉ định/khởi tạo, tạo một hình ảnh mới. –

+0

Tôi dường như là một moron, xin lỗi. Tôi đã tìm kiếm điều đó trong bình luận của bạn, nhưng bỏ qua nó, và đưa ra một giả định nghèo dựa trên câu hỏi được chỉnh sửa .... –

7

Bất cứ khi nào chúng tôi sử dụng dataWithContentOfURL chúng ta phải gửi kèm theo nó với NSAutoReleasePool, như sau:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// ** Your Operations ** 

NSData *data = [NSData dataWithContentsOfURL:someURL]; 

// ** Your Operation ** 

[data autorelease]; 
[pool release]; 

này áp dụng ngay cả đối với NSURLRequestNSURLConnection.

Vấn đề là với trình biên dịch và trên đây là phương pháp duy nhất để giải quyết vấn đề.

+1

Đây là câu trả lời. Tuyệt quá. –

+0

Điều này hoàn toàn sai. Bạn đã không giữ lại đối tượng với bất kỳ 'retain',' alloc', 'copy',' mutableCopy' hoặc 'new'. Bạn không có quyền 'autorelease' nó. Điều này là không chính xác và sẽ làm cho chương trình của bạn thất bại ở đâu đó dưới dòng. – user102008

Các vấn đề liên quan