2012-05-17 27 views

Trả lời

2

Đối IBOutlets đánh dấu là mạnh bạn vẫn muốn để nil chúng ra trong viewDidUnload.

Tại sao:

Khi bạn nhận được thông báo bộ nhớ thấp bất kỳ quan điểm hiện nay không nhìn thấy được có thể dỡ bỏ bản thân (gọi viewDidUnload) để tiết kiệm bộ nhớ. Bằng cách nilling ra cửa hàng của bạn, bạn đang từ bỏ quyền sở hữu và để cho họ được phát hành. Khi khung nhìn được nạp lại (khi nó được hiển thị lại), các cửa hàng sẽ được thiết lập lại và viewDidLoad sẽ được gọi.

13

Mục đích chính của cửa hàng là không tạo ra zombie, rò rỉ và các tình huống kỳ lạ có thể xảy ra khi các bản xem trước không có chế độ xem siêu, trong khi chế độ xem đã được tải xuống từ trình điều khiển chế độ xem.

Bây giờ với phiên bản Xcode mới nhất nếu bạn kéo phần tử chế độ xem bên trong tiêu đề hoặc trong tuyên bố riêng, nó sẽ tự động đặt Outlet thành yếu (nhắm mục tiêu iOS> = 5) và trong phương thức viewDidUnload nó sẽ ghi [self setYourOutlet:nil]; trong trường hợp này là không cần thiết, nhưng là một thực hành tốt. Nếu bạn nhắm mục tiêu ioses thấp hơn là cần thiết, bởi vì bạn không thể sử dụng tham chiếu yếu. Tôi đề nghị sử dụng luôn vì đó là một thói quen tốt.

CẬP NHẬT

Tôi muốn để hoàn thành câu trả lời để tránh những hiểu lầm (nói về iOS5 chỉ) chú ý rằng IB đặt ổ cắm yếu chỉ khi là subviews của một giao diện chính. Thông thường nó xảy ra trong một xib chứa một khung nhìn từ một bộ điều khiển khung nhìn.

Đôi khi có thể xảy ra rằng bạn cần trao đổi hai chế độ xem dựa trên một số điều kiện trong thời gian chạy mà không cần tạo chúng theo lập trình hoặc trong các xib khác nhau. Ví dụ, bạn có quan điểm chính của bạn thuộc sở hữu của vc, và trong cùng một xib bạn tạo ra hai quan điểm khác mà trong thời điểm đó không có một giám sát. Nếu bạn cố gắng kết nối chúng với cùng một kỹ thuật, tham chiếu được tạo sẽ là strong. Khi chạy, bạn có thể hoán đổi các khung nhìn đơn giản bằng cách thêm hoặc loại bỏ từ giám sát tất nhiên bạn nên nil chúng trong viewDidUnload.

+0

Tại sao bạn xem xét thực tiễn tốt sau đây; '[self setYourOutlet: nil]; có lẽ trong trường hợp này là không cần thiết, nhưng là một thực hành tốt '? –

+0

@ Ríomhaire tốt, hãy tưởng tượng rằng bạn cần phải hạ thấp mục tiêu triển khai xuống 4.3, trong trường hợp này bạn sẽ chỉ cần thay đổi yếu thành unsafe_unretained – Andrea

+0

Tốt nhất, cảm ơn. –

11

Tôi sẽ mở rộng câu trả lời của Andrea ở đây (upvote anh ấy!) Bởi vì câu trả lời không thẳng về phía trước trừ khi bạn chỉ có nghĩa là thành phần giao diện người dùng, trong trường hợp này nên tất cả là yếu.

IBOutlets là bất kỳ điều gì bạn xác định chúng. Nếu bạn sử dụng:

@property (nonatomic, strong) IBOutlet UIView *someView;

Bạn nên nil này khi dỡ phụ huynh xem/cửa sổ.

Nếu bạn làm:

@property (nonatomic, weak) IBOutlet __weak UIView *someView;

Bạn không cần phải nil biến, bởi vì nó sẽ được tự động zero'ed.

Cách bạn không hoàn toàn tùy thuộc vào bạn. Trước ARC tôi đã sử dụng:

[someView_ release], someView_ = nil;

Bây giờ bạn có hai lựa chọn: hoặc sử dụng setter (tạo ra với với @synthesize) hoặc thiết lập Ivar cơ bản trực tiếp. Kết quả là như nhau - trong cả hai trường hợp vòng loại của vòng đời của đối tượng sẽ lưu ý nó là sử dụng cuối cùng và phát hành nó.

Vì vậy, đi trước và làm điều này:

self.someView = nil

hoặc

@synthesize someView = someView_; 
... 
someView_ = nil; 
+4

+1 Đây là câu trả lời đúng. Bạn phải đặt tham chiếu mạnh thành 'nil' để giải phóng tài nguyên. Không cần thiết lập các tham chiếu yếu đến 'nil' vì trình biên dịch sẽ làm điều đó cho bạn nếu tài nguyên được deallocated. – Caleb

+0

Tôi nghĩ rằng trình biên dịch dưới ARC đặt * mạnh * tài sản để nil là tốt? –

+0

Nó không quan trọng - bạn không thể đọc nó. Các thuộc tính yếu có thể trở thành không tại bất kỳ thời điểm nào trong quá trình thực hiện. Khi bạn * cuối cùng * sử dụng một đối tượng * phạm vi cục bộ * bạn nil nó (gây ra trình biên dịch phát hành nó), nếu bạn tiếp tục sử dụng nó, bạn có thể quan sát một giá trị nil. Ngoài ra, bạn có thể cho phép trình biên dịch phát hành một đối tượng phạm vi cục bộ cho bạn khi nó nằm ngoài phạm vi, nhưng để lại phạm vi ngụ ý sử dụng * final * khi bạn không bao giờ quan sát giá trị nil. Các thuộc tính mạnh * được sắp xếp cho lớp của bạn, do đó việc phát hành ngụ ý xảy ra trong dealloc, sau đó bạn không thể truy cập vào thành viên. –

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