2011-01-10 25 views
7

Tôi đang thay đổi hình ảnh của UIImageview bằng [self setImage: newImage];(iphone) UIImageView setImage: rò rỉ?

Dường như mỗi lần tôi làm điều đó với newImage, hình ảnh trước đó dường như không được phát hành.
Cách chính xác để thay thế hình ảnh của UIImageView là gì?

Cảm ơn bạn

+1

bạn có thể đăng thêm một chút mã không? Làm thế nào để bạn tạo/cư newImage? – Axel

Trả lời

6

UIImageView setImage: không bao giờ bị rò rỉ, trừ khi hình ảnh bạn đang truyền không được phát hành.

Mã của bạn sẽ không bị rò rỉ, nếu bạn đang gán hình ảnh tự động phát hành cho chế độ xem hình ảnh, chẳng hạn như sau.

UIImage *newImage = [UIImage imageNamed:@"sampleImage"]; 
[yourImageView setImage:newImage]; 

Nhưng, nếu bạn đang phân bổ hình ảnh ở đâu đó, bạn phải phát hành hình ảnh theo cách thủ công.

+3

Tôi đang thực sự lấy mẫu làm mã của bạn. Nhưng "dụng cụ" cho thấy bộ nhớ tăng lên mỗi khi tôi làm điều đó. tabbing ra khỏi "cây gọi" để "thống kê" trong "phân bổ dụng cụ" và trở lại "cây gọi" cho thấy bộ nhớ quay trở lại nơi nó nên được. có thể đối tượng autoreleased không được hiển thị đúng trong thời gian trong các công cụ? – eugene

+0

Có thể .. Tôi không chắc chắn .. Bạn có thể đăng mã như thế nào bạn đang tạo và gán hình ảnh? – EmptyStack

+0

[UIImage imageNamed:] sẽ lưu trữ dữ liệu hình ảnh, do đó có thể là nguyên nhân gây ra "rò rỉ". –

9

Có, UIImageView setImage bị rò rỉ! Trên thực tế, rò rỉ CGImage, không UIImage (như công cụ "phân bổ" show)

tôi sử dụng BrutalUIImage thay vì UIImage

@interface BrutalUIImageView : UIView { 
    UIImage *image; 
} 

@property(nonatomic, retain) UIImage *image; 

@end 

@implementation BrutalUIImageView 
@synthesize image; 

- (void)setImage:(UIImage *)anImage { 
    [image autorelease]; 
    image = [anImage retain]; 
    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect { 
    [super drawRect:rect]; 
    [image drawInRect:rect]; 
} 

- (void)dealloc { 
    [image release]; 
    [super dealloc]; 
} 

@end 
0

lớp BrutalUIImageVIew của bạn là thực sự thú vị, nhưng bằng cách vẽ các hình ảnh sử dụng UIImage "drawInRect: "phương pháp, tôi mất các vùng trong suốt của tệp PNG của tôi.

Bạn có biết cách vẽ hình ảnh, giữ độ trong suốt PNG không? (Tất nhiên, không sử dụng UIImageVIew bị rò rỉ CGImage trong khi gọi "setImage:")

+0

Cố gắng đặt phương thức 'self.opaque = NO;' in ** BrutalUIImageView init **. –

0

Có UIImageView setImage thực sự bị rò rỉ!

Nếu bạn lướt qua một loạt các hình ảnh với

[yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]]; 

bạn có thể nhìn thấy trên sử dụng bộ nhớ cụ ngày càng tăng. Điều này có vẻ là một số loại bộ nhớ đệm đi xung quanh kể từ sau khi đi xe đạp thông qua tất cả việc sử dụng bộ nhớ hình ảnh sẽ đi bằng phẳng.

Các chính xác, hoặc ít nhất, cách không bị rò rỉ để làm điều đó là:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"]; 
    UIImage *newImage = [[UIImage alloc] initWithContentsOfFile:thePath]; 
    [yourImageView setImage:newImage]; 

tôi xác nhận này trên mã của tôi như APP của tôi đã đi xe đạp qua rất nhiều các tập tin hình ảnh lớn.

+0

Những gì bạn thấy không phải là rò rỉ UIImageView, nhưng lưu vào bộ nhớ cache trong [UIImage imageNamed:] –