2013-09-23 27 views
9

Phân tích thông qua document on class clusters này, NSNumber thực hiện initWithChar: trong khoảng cách sau đây:initializers Cụm với ARC

- (id)initWithChar:(char)c 
{ 
    [self release]; 
    return [[__NSCharNumber alloc] initWithChar:c]; 
} 

Tương tự, bạn có thể sử dụng mô hình này để khởi lượt xem từ Nib:

- (id)initWithFrame:(CGRect)frame 
{ 
    id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0]; 
    realSelf.frame = frame; 
    [self release]; 
    return realSelf; 
} 

tôi 'm tự hỏi, không ARC quản lý việc phát hành của unnourned self trong những trường hợp này? Nó được ghi chép ở bất cứ nơi nào?

+0

Đó là "nhóm lớp", không phải "các lớp cụm". – jlehr

Trả lời

6

Tìm thấy chi tiết in the clang documentation.

init sử dụng ngầm thuộc tính __attribute__((ns_consumes_self)), có nghĩa là trong khi self được định nghĩa là __strong id self thì nhiệm vụ ban đầu sẽ không giữ lại. Điều này có nghĩa là ngay sau khi self được gán lại hoặc chức năng chấm dứt, self sẽ được phát hành bằng các quy tắc mạnh mẽ chuẩn.

Để nhận +1, có một ẩn số __attribute((ns_returns_retained)) ngăn không cho đối tượng được trả lại thoát ra ở cuối.

Ở mức cao, ARC có kế hoạch giải phóng giá trị ban đầu là self thêm một lần vào cuối hàm, đồng thời giữ lại giá trị trả lại, duy trì đầu ra +1 của nó.

+0

Cảm ơn, Brian. Bạn có thể vui lòng cho biết, mã sẽ trông như thế nào? – Slabko

+1

@Slabko Không có gì khác ngoài việc trả về một thể hiện mới của một lớp con trong 'initWith ...'. Tôi đã tập hợp một vài ví dụ về các nhóm lớp ở đây: https://github.com/bnickel/Cluster-Initializer-Examples –

3

Nó sẽ nằm trong quy tắc quyền sở hữu đối tượng ARC chuẩn, theo đó "không trả lại self" sẽ kết thúc mà không có bất kỳ tham chiếu mạnh nào và do đó sẽ tự động được giải phóng cho bạn khi nó nằm ngoài phạm vi.