2011-02-04 27 views
6

Tôi đã đính kèm UIGestureRecognizer vào UIView. Trách nhiệm của ai là phát hành điều này trong quá trình dealloc?Tôi có chịu trách nhiệm phát hành cử chỉ của UIViewRecognizers trong dealloc không?

Cụ thể:

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)]; 

[self.view addGestureRecognizer:t]; 
[t release]; 

Vì vậy, self.view hiện có giữ lại duy nhất của gestureRecognizer.

Cập nhật Tôi nên rõ ràng hơn. Câu hỏi của tôi phải làm với phương thức viewsloc. Lớp cha của view có xử lý việc phát hành gestureRecognizer khi khung nhìn được phát hành hay không. Tôi hiện đang cho rằng đó là trường hợp.

Trả lời

1

Quy tắc chung là bạn gọi release bất cứ khi nào bạn gọi alloc, new hoặc copy.

Vì bạn được gọi là phân bổ, mã của bạn không quá phát hành hoặc rò rỉ bất kỳ thứ gì.

Trong khi bạn có thể autorelease recognizer cử chỉ của bạn, tôi sẽ không vì phát hành một cách rõ ràng các đối tượng, nếu có thể, là quản lý bộ nhớ tốt hơn. (Các đối tượng được tự động phát hành không được giải phóng cho đến khi bể tự động thoát nước.)

2

Mã của bạn là chính xác.

Chế độ xem chiếm quyền sở hữu bộ lặp lại cử chỉ với [self.view addGestureRecognizer:t].

Bạn có thể sắp xếp gọn gàng mã của bạn bằng autoreleasing t khi bạn tạo ra nó:

UITapGestureRecognizer *t = [[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)] autorelease]; 
[self.view addGestureRecognizer:t]; 

Điều này có nghĩa rằng tất cả các quyền sở hữu của t được xử lý ở một nơi do đó làm giảm tiềm năng để giới thiệu những vấn đề nếu mã được modifed.

+0

Không phải là thói quen tốt để gọi tự động phát trên tất cả các đối tượng thay vì tự giải phóng chúng. – Tieme

+0

@Tieme I không đồng ý. Nó giữ tất cả các mã quản lý bộ nhớ ở một nơi giúp cải thiện khả năng đọc và do đó làm giảm khả năng rò rỉ do quên 'giải phóng'. Việc phát hành chậm sẽ không ảnh hưởng đến dấu hiệu nước cao bộ nhớ bởi vì đối tượng sẽ vẫn tồn tại sau khi thoát khỏi phương pháp này. Lý do của bạn cho biết rằng sử dụng autorelease là một thói quen không tốt? –

+0

Tôi đồng ý với bạn về ví dụ này. Ở đây tốt để gọi autorelease. Nhưng nó vẫn không phải là một thói quen tốt để luôn luôn autoreleasing các đối tượng của bạn gây ra cuối cùng nó sẽ thêm một số chi phí để quản lý bộ nhớ của bạn. – Tieme

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