Có thể những ví dụ đó sử dụng mã giữ lại vì mã mẫu được phân bổ theo chương trình và khởi tạo UILabel và sau đó thêm nó vào UIView. Đó là trường hợp của nhiều ví dụ, vì việc học cách sử dụng Interface Builder thường không phải là vấn đề của họ.
Ví dụ thứ hai (không có thuộc tính và không tổng hợp) với IBOutlet được sử dụng khi nhà phát triển gán 'UILabel (Nút, Chế độ xem, v.v.) trong Trình tạo giao diện - bằng cách kéo IBOulet vào Nhãn hoặc Chế độ xem khác thành phần. Theo ý kiến của tôi, hành động kéo và thả trước đó (Label on View) cũng thêm subview, Label vào View - và vân vân. Nhãn được giữ lại bởi một View; một View được giữ lại bởi Window; Cửa sổ được giữ lại bởi Chủ sở hữu tệp. Chủ sở hữu tệp thường là Tài liệu của bạn được khởi động chính.
Bạn sẽ lưu ý rằng khi bạn bước qua chương trình của bạn (bằng cách thêm một awakeFromNib
- (void)awakeFromNib
{
[fooLabel blahblah];
}
rằng fooLabel đã có một địa chỉ bộ nhớ.
Thats vì Label được khởi tạo từ một gói tập tin (các nib tập tin) bằng cách sử dụng không init nhưng initWithCoder. Mà về cơ bản deserializes các dòng phim để một đối tượng - và sau đó đặt biến IBOutlet. (Chúng tôi vẫn đang nói về phương pháp IBOutlet.) (01). thod sử dụng phương pháp Giá trị khóa
call [object setValue:outletValue forKey:@"<OutletName>"]
là mẫu Observer/Observable. Mẫu đó yêu cầu đối tượng Observable tham chiếu từng Observer trong một Set/Array. Một thay đổi về giá trị sẽ lặp lại Set/Array và cập nhật bằng nhau tất cả các Observers. Bộ đó S already đã giữ lại mỗi Máy quan sát do đó việc thiếu giữ lại trong iOS.
Hơn nữa và phần còn lại là đầu cơ.
Dường như trường hợp khi bạn sử dụng giao diện Builder sau đó
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
có thể cần được thay đổi để
@property (nonatomic, weak) IBOutlet UILabel *fooLabel;
hoặc @property (nonatomic, chuyển nhượng) IBOutlet UILabel * fooLabel;
Và sau đó nó không cần phải được phát hành trong một phương pháp dealloc. Plus nó sẽ đáp ứng các yêu cầu OSX và iOS.
Điều đó dựa trên logic và tôi có thể thiếu một số phần ở đây.
Tuy nhiên, có thể không quan trọng nếu lượt xem liên tục trong suốt thời gian tồn tại của chương trình của bạn. Trong khi một nhãn trong một hộp thoại phương thức (mở, đóng, mở, đóng) thực tế có thể bị giữ lại quá mức và bị rò rỉ trên mỗi chu kỳ. Và đó là bởi vì (đầu cơ một lần nữa) mỗi hộp thoại đóng được tuần tự hóa thành một hệ thống tập tin và do đó tồn tại x, y vị trí và kích thước, cùng với các phần phụ của nó, vv Và sau đó deserialized ... vào phiên kế tiếp mở (ngược với nói minimiz hoặc ẩn.)
Xin chào Jon, Cảm ơn bạn đã trả lời chi tiết! Rất hữu ích –
điều gì sẽ xảy ra nếu tên biến khác với tên thuộc tính? Có vấn đề gì nếu khác nhau? –
Tên "OutletName" ở trên được định nghĩa là tên bên cạnh từ khóa "IBOutlet" trong mã nguồn. Nếu IBOutlet nằm trong @property, không có vấn đề gì về biến thể hiện được đặt tên kể từ khi thiết lập trình tìm kiếm. Nếu vì một lý do nào đó, một setter không tồn tại, sẽ có một ngoại lệ được nâng lên khi kết nối ổ cắm. Nếu từ khóa IBOutlet nằm trên biến mẫu, và trình đặt sẵn tồn tại với tên không khớp, trình thiết lập sẽ không được gọi. –