Sử dụng phương pháp NSObject -(id)awakeAfterUsingCoder:(NSCoder *)decoder
làm ví dụ, tài liệu nói:Mô hình mới để phát hành bản thân với tính năng tham chiếu tự động là gì?
Cho phép một đối tượng, sau khi được giải mã, để thay thế một đối tượng cho chính nó. Ví dụ, một đối tượng đại diện cho một phông chữ có thể, khi được giải mã, tự giải phóng và trả về một đối tượng hiện có có cùng một mô tả phông chữ giống như chính nó . Bằng cách này, các đối tượng thừa có thể bị loại bỏ .
Thông thường bạn sẽ làm gì
[self release];
return substitutedObject;
Với ARC bạn phải rời khỏi dòng này ra. Nó sẽ không bị rò rỉ? Hay tôi chỉ nên tin tưởng đối tượng NSCoder để giải phóng đối tượng gốc cho tôi? Nếu vậy tại sao bạn phải tự giải phóng một cách rõ ràng với mã không phải ARC ở nơi đầu tiên?
Tôi không nghĩ self = nil
là chính xác trong ánh sáng của những gì các tài liệu biên dịch nói về bản thân: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self
Bạn có thể làm rõ lý do tại sao bạn phải giữ lại kết quả một cách rõ ràng không? Chắc chắn đánh bại mục đích của ARC. Cảm ơn bạn đã trả lời mọi thứ khác. – jamesmoschou
@moshy bạn được chào đón. có - tôi ban đầu bỏ qua chi tiết đó. lý do là 'awakeAfterUsingCoder:' trả về tham chiếu không sở hữu (hoặc tự động phát hành). như vậy, ARC chèn một số giảm ref cho chúng tôi cho giá trị trả về của chúng tôi. những gì chúng tôi muốn làm là chuyển giao * một cách hiệu quả từ một đối tượng này sang đối tượng khác. tôi chạy nó trong các dụng cụ - không bị rò rỉ. không có zombie. mà không có sự giữ lại rõ ràng, một zombie sẽ được gửi đi. mà không có bản phát hành rõ ràng - rò rỉ. thử nó cho chính bạn (đặt khối '@ autorelease' trong một' while (1) '). – justin
Bạn có thể đặt phương thức thành viên của họ «init' với' __attribute __ ((objc_method_family (init))) 'và sau đó gán lại' self'? –