2009-09-30 17 views
6

Trong đối tượng lớp học của tôi, tôi đã xác định thuộc tính (nonatomic, retain) cho UIImage. tôi giao tài sản này với một hình ảnh được tải quaPhát hành thuộc tính UIImage giữ lại được tải qua imageNamed?

[UIImage imageNamed:@"file.png"]; 

Nếu lúc nào đó tôi muốn chuyển nhượng lại tài sản này để hình ảnh khác, tôi cần phải phát hành tài liệu tham khảo trước?

Tôi bối rối vì tài sản lưu giữ tôi biết tôi nên phát hành nó. Nhưng vì imageNamed: là một phương pháp tiện lợi (không sử dụng phân bổ), tôi không chắc chắn áp dụng quy tắc nào ở đây.

Cảm ơn thông tin chi tiết!

Trả lời

2

Hình ảnh được trả lại cho bạn được tự động phát hành theo các quy tắc đặt tên. Gán nó cho một thuộc tính với thuộc tính giữ lại thông qua setter sẽ giữ lại nó. Việc gán một hình ảnh khác cho thuộc tính thông qua trình thiết lập sẽ giải phóng hình ảnh cũ và giữ lại hình ảnh mới.

0

Từ docs:

... nếu bạn có kế hoạch để giữ được một đối tượng hình ảnh trở lại, bạn phải giữ lại nó như bạn sẽ bất kỳ đối tượng Cocoa.

Có nghĩa là nếu bạn không còn muốn giữ nó nữa, bạn nên giải phóng nó (giả sử bạn đã giữ lại).

1

Khi bạn xác định một tài sản với nonatomic & retain, nó tạo ra một setter cho bạn trông như thế này:

-(void)setImage:(UIImage*)newImage { 
    if (image != newImage) { 
    [image release]; 
    image = [newImage retain]; 
    } 
} 

Như bạn thấy, nó giải phóng giá trị trước đó trước khi giữ lại các giá trị mới.

Trong trường hợp cụ thể của bạn, hình ảnh được tự động trả về -[UIImage imageNamed:] sẽ tự động được giữ lại khi bạn gán cho thuộc tính và sau đó tự động phát hành khi bạn gán một hình ảnh khác (hoặc nil) cho sản phẩm.

0

Bạn nên phát hành tất cả các đối tượng bạn đang duy trì, tuy nhiên khi bạn xác định đối tượng hình ảnh của bạn, tôi tin rằng mã của bạn sẽ trông như thế này:

UIImage *img = [[UIImage imageNamed:@"file.png"] retain]; 
6

Đúng, Florin ... nhưng mỗi cuộc thảo luận ở trên , nếu người ta đang sử dụng một setter cho tài sản đó (hoặc thông qua tổng hợp, hoặc bằng tay) hiện "giữ lại", sau đó không cần phải giữ lại thêm.

Nói cách khác, những điều sau đây sẽ đúng (và không bị rò rỉ bộ nhớ), IMHO, tôi có đúng không? Tôi nghĩ đây là ý định ban đầu của câu hỏi ... và tôi cũng muốn chắc chắn. ;-) cám ơn!

@interface MyClass { 
    UIImage *myImage; 
} 
@property (nonatomic, retain) UIImage *myImage; 
@end 

@implementation MyClass 
@synthesize myImage; 

- (void) someMethod { 

    self.myImage = [UIImage imageNamed:@"foo.png"]; 
} 

- (void) someOtherMethod { 

    self.myImage = [UIImage imageNamed:@"bar.png"]; 
} 

- (void) dealloc { 

    self.myImage = nil; 
    [super dealloc]; 
} 
@end 
+0

Điều này là chính xác. sử dụng 'self.myImage = someImage' gọi phương thức setter để giữ lại nó cho bạn. AND '[UIImage imageNamed:]' trả về một hình ảnh được tự động phát hành, có nghĩa là bạn không phải dọn dẹp sau nó. –

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