2009-08-27 28 views
11
for(UIView *subview in [scrollView subviews]) { 
    NSLog(@"subviews Count=%d",[[scrollView subviews]count]); 
    //[subview release]; 
    [subview removeFromSuperview]; 
} 

trong các phương pháp trên nếu tôi sử dụng [subview removeFromSuperview]; nó hoạt động tốt ... nhưng nếu tôi sử dụng [subview release]; Nó crashes..i muốn biết rằng nếu cả hai đều giống nhau hoặc có bất kỳ sự khác biệt giữa chúng?có thực hiện xóa bỏ các bản phát hành các đối tượng của scrollview không?

Trả lời

29

@MathieuK là chính xác, nhưng đáng để tìm hiểu sâu hơn về điều này, vì đó là một khái niệm rất quan trọng trong ObjC. Bạn không bao giờ nên gọi -release trên một đối tượng mà bạn đã không -retain một cách rõ ràng hoặc ngầm (bằng cách gọi một trong số Three Magic Words). Bạn không gọi -release để deallocate một đối tượng. Bạn gọi nó để giải phóng khoản giữ bạn đã đặt trên đối tượng. Cho dù scrollview là giữ lại subviews của nó không phải là doanh nghiệp của bạn (nó giữ lại các subviews của nó, nhưng nó vẫn không phải doanh nghiệp của bạn). Cho dù -removeFromSuperview gọi -release cũng không phải là doanh nghiệp của bạn. Đó là betweeen scrollview và subviews của nó. Tất cả những vấn đề đó là bạn giữ lại các đồ vật khi bạn quan tâm và giải phóng chúng khi bạn ngừng quan tâm đến chúng, và để phần còn lại của hệ thống giữ lại và giải phóng những gì quan tâm.

10

Số lần giữ lại của các bản xem trước của bạn có thể là 1. Khi bạn gọi [subview release]; số lần giữ lại sẽ là 0 và chế độ xem phụ được phát hành từ bộ nhớ. Quyền truy cập tiếp theo vào chế độ xem phụ (gọi số removeFromSuperview) bị treo do không có chế độ xem phụ nữa.

Trong trường hợp này, bạn chỉ nên gọi [subview removeFromSuperview]removeFromSuperview sẽ gọi số release trên chính chế độ xem phụ.

1

Bạn cần sửa đổi Cocoa Memory Management.

Bạn chỉ đơn giản là không giải phóng những thứ mà bạn chưa phân bổ hoặc giữ lại một cách rõ ràng.

-3

Không họ không giống nhau, nếu bạn kiểm tra

retainCount

sau

removeFromSuperView

bạn sẽ thấy rằng không có gì thay đổi, vì vậy bạn có thể thêm cùng một lần xem wit hout phân bổ nó !!

cộng với bạn không bao giờ nên nhả một đối tượng mà bạn chưa bao giờ được phân bổ !!

+0

Không bao giờ sử dụng retainCount. http://stackoverflow.com/a/4636477/19329 – pablasso

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