2013-02-07 31 views
6

trong các dự án của tôi Tôi không sử dụng Interface Builder và tôi đã nhận thấy một điều mà tôi không biết cách giải thích. Chưa. Vì vậy, đến điểm. Khi chúng tôi đang sử dụng IB và xác định các yếu tố của giao diện người dùng như UILabel hoặc UIButton trong bộ điều khiển của chúng tôi, chúng tôi sử dụng tiền tố xấu xí này IBOutlet và một công cụ sửa đổi 'yếu'. Điều này hoạt động như âm nhạc. Nhưng khi chúng tôi quyết định không sử dụng IB và xác định toàn bộ giao diện người dùng từ mã nó chỉ không hoạt động.Các công cụ sửa đổi mạnh và yếu với các phần tử giao diện ios

Giả sử rằng tôi muốn thêm UILabel vào bộ điều khiển (sử dụng IB). Tôi sẽ có nội dung như thế này * * .h tệp:

@property (nonatomic, weak) IBOutlet UILabel * label; 

Và tôi không phải làm gì thêm trong tệp * .m. Nhưng nếu tôi loại bỏ các * .xib tập tin và cố gắng thiết lập UILabel của tôi, ví dụ, một trong những phương pháp init, như thế này:

self.label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)]; 
self.label.text = @"some text"; 
[self.view addSubview:self.label]; 

Nó không làm việc cho đến khi tôi thay đổi file * .h của tôi để này :

@property (nonatomic, strong) UILabel * label; 

Bây giờ, tôi biết sự khác biệt giữa yếu và mạnh nhưng tôi không biết tại sao chúng ta có thể sử dụng yếu tố ui khi sử dụng IB? Một cái gì đó phải giữ một con trỏ mạnh mẽ cho các yếu tố này, phải không? Nhưng cái gì?? Trong trường hợp thứ hai nó là bộ điều khiển, nhưng tôi không hiểu nó hoạt động như thế nào trong trường hợp đầu tiên.

+0

Tôi không biết tại sao/có thể/nên yếu. Nó chắc chắn cần phải mạnh mẽ. –

+0

Nó cần, khi bạn không sử dụng IB, đó là obviuos, đầu mối của câu hỏi của tôi là "những gì giữ con trỏ mạnh khi bạn sử dụng IB?", Bởi vì nó không phải là một bộ điều khiển, phải không? ;) –

+0

@ H2CO3 xem báo giá của tôi từ các tài liệu trong câu trả lời của tôi, cụ thể là, "Cửa hàng bạn tạo nên do đó thường yếu" – WDUK

Trả lời

2

Điều gì đó phải giữ một con trỏ mạnh mẽ cho những yếu tố này, đúng không? Nhưng cái gì??

Đúng, bạn phải có ít nhất 1 tham chiếu mạnh mẽ để đối tượng tồn tại. Bạn sẽ chỉ cần phải có một tham chiếu mạnh mẽ đến các đối tượng cấp cơ sở của giao diện người dùng, bất cứ điều gì dưới đây này có thể là yếu (như các đối tượng cha mẹ sẽ sở hữu con cái của họ). Tệp .xib phối hợp với Chủ sở hữu tệp của nó sẽ thực hiện việc này cho bạn.

Xem this document on the workings of xib files. Cụ thể, đoạn mã này:

Bạn thường cần tham chiếu mạnh mẽ đến các đối tượng cấp cao nhất để đảm bảo chúng không bị phân phối; bạn không cần tham chiếu mạnh mẽ đến các đối tượng thấp hơn trong biểu đồ vì chúng thuộc sở hữu của cha mẹ và bạn nên giảm thiểu nguy cơ tạo chu kỳ tham chiếu mạnh mẽ.

Từ góc nhìn thực tế, trong các cửa hàng iOS và OS X phải được xác định là thuộc tính được khai báo. Các cửa hàng nói chung nên yếu, ngoại trừ những người từ Chủ sở hữu tệp đối với các đối tượng cấp cao nhất trong một tệp nib (hoặc trong iOS, một cảnh kịch bản) cần phải mạnh mẽ. Cửa hàng mà bạn tạo nên do đó thường bị yếu

+0

cảm ơn rất nhiều, đây là phần kiến ​​thức mà tôi đã bỏ lỡ cho đến bây giờ. Cảm ơn bạn rất nhiều! –

+0

'UINib' không sở hữu các đối tượng mà nó tạo ra sau khi nó được tạo xong. –

+2

Điều này không đúng. Các UINib không sở hữu các cửa hàng, họ được sở hữu bởi quan điểm - một cái nhìn có tài liệu tham khảo mạnh mẽ để xem xét của nó. Tài liệu tham khảo yếu là để giải phóng bộ nhớ khi khung nhìn đã được dỡ xuống, điều này không xảy ra nữa, do đó, sắp xếp của nó là moot ngay bây giờ. – jrturton

4

Lý do tại sao giao diện Builder tạo ra tham chiếu yếu cho IBOutlets là như sau:

IB biết rằng một cái nhìn được giữ lại bởi SuperView của nó. Vì vậy, bất kỳ đối tượng trong cây quan điểm không cần phải có tài liệu tham khảo mạnh mẽ khác hơn là đối tượng gốc. Bộ điều khiển xem giữ tham chiếu mạnh mẽ này trong thuộc tính view chính của nó.

Bây giờ khi chế độ xem chưa được tải (ít nhất là cho đến iOS 5), thuộc tính view của UIViewController được đặt thành 0, phát hành chế độ xem chính. Nếu IBOutlets để xem xét của superview này sẽ là tài liệu tham khảo mạnh mẽ họ sẽ giữ một phần của hệ thống phân cấp xem trong bộ nhớ. Đó là điều không mong muốn (và có thể có thể dẫn đến nhầm lẫn khi truy cập vào các quan điểm mồ côi này).

+1

Ok, giờ mọi thứ đã rõ ràng, cảm ơn bạn rất nhiều! –

+1

phải là câu trả lời được chấp nhận: nó rõ ràng hơn nhiều so với quá trình sao chép tài liệu của Apple ... – tiguero

1

Mặc dù câu trả lời được chấp nhận, đây là cách bạn thể làm cho nó trong mã:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,100,20)]; // strong ref 
label.text = @"some text"; 
[self.view addSubview:label]; // strong ref from superview 
self.label = label; // weak ref 
// Now you can do `label = nil;` 

Đây là điểm khi tải từ XIB. labelđã có superview khi được gán cho thuộc tính yếu của bạn.

+0

Điều này có vẻ đầy hứa hẹn, tôi sẽ phải kiểm tra nó, cảm ơn –

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