2009-10-30 27 views
10

Tôi đang đọc về Mã hóa và Giải mã và tôi nhận thấy rằng đôi khi mọi người bỏ lỡ phần còn lại, tôi cũng nhận thấy rằng việc giữ lại đôi khi được sử dụng trên một số biến thể nhưng không được sử dụng cho những người khác. Tôi có thể yêu cầu ...Sử dụng giữ lại trong initWithCoder?

(1) Mục đích của việc lưu giữ này là gì và tại sao đôi khi không cần thiết?

(2) Việc sử dụng các khoản giữ lại có nghĩa là tôi cần khớp với bản phát hành không và nếu có?

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [[decoder decodeObjectForKey: @"CardName"] retain]; 
    email = [[decoder decodeObjectForKey: @"CardEmail"] retain]; 
} 

hoặc

- (id) initWithCoder: (NSCoder *) decoder { 
    name = [decoder decodeObjectForKey: @"CardName"]; 
    email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

gary

+0

Rất có thể, các mẫu mã bạn thấy không rõ ràng giữ lại đối tượng đã giải mã đang sử dụng các phương thức setter để xác nhận quyền sở hữu. – Chuck

Trả lời

12

snippit Your first đại diện cho hành vi đúng. Phương pháp -decodeObjectForKey: không chứa từ init, copy hoặc new, do đó, không có lời hứa nào về việc liệu đối tượng có trả lại sẽ ở lại hay không và nếu có trong bao lâu. Nếu đối tượng của bạn cần các màu của nó để ở xung quanh, nó sẽ là -retain các đối tượng mà nó lấy lại từ bộ giải mã. Điều này -retain sẽ cần phải được cân bằng với một -release, mà sẽ được trong phương pháp của bạn đối tượng -dealloc (do đó đối tượng được tạo ra với một số ivars ban đầu mà nó giữ lại, và nó phát hành ivars của nó khi nó bị phá hủy). Như thế này:

- (void)dealloc { 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

Các giữ lại/phát hành khiêu vũ là không cần thiết:

  • nếu bạn đang sử dụng thu gom rác thải

  • nếu đối tượng của bạn không cần phải khẳng định quyền sở hữu của mình ivars. Đó không phải là trường hợp thường xảy ra; đại biểu thường không được giữ lại (nhưng sau đó thường không được lưu trữ) hoặc, và các thuộc tính được khai báo với công cụ sửa đổi assign cũng không được.

+0

Tôi có thể cần một chuyến đi vòng hướng dẫn quản lý bộ nhớ, tôi có thể hỏi, nếu tôi phân bổ một lớp đơn giản có chứa một biến cá thể NSString duy nhất, tôi có nên phát hành nó trong dealloc của mình hay không. – fuzzygoat

+0

có, bạn nên giữ lại biến mẫu khi nó được thiết lập và giải phóng nó khi nó không còn cần thiết nữa. Tôi đã có một bài đăng trên blog với một tập hợp các liên kết đến các bài viết về quản lý bộ nhớ: http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html –

+0

Cảm ơn Graham, tôi nghĩ rằng tôi đã đạt được điều đó ngay bây giờ , Tôi đã liên kết bài đăng trên blog của bạn để tham khảo trong tương lai. Có một ngày cuối tuần tuyệt vời. – fuzzygoat

9

Bạn cũng có thể bị lừa bởi những người sử dụng thuộc tính. Có thể bạn đã thấy những người đang thực hiện:

- (id) initWithCoder: (NSCoder *) decoder { 
    self.name = [decoder decodeObjectForKey: @"CardName"]; 
    self.email = [decoder decodeObjectForKey: @"CardEmail"]; 
} 

điều này sẽ ổn nếu tên và email được xác định là thuộc tính 'lưu giữ'. Tất nhiên, sau đó bạn tham gia vào cuộc tranh luận về việc liệu pháp lý/khuyến khích sử dụng các trình truy cập thuộc tính trong các phương thức khởi tạo/dealloc - một số nói có, một số nói không, Apple dường như ở bên cạnh nhưng chưa bao giờ thực sự đưa ra lý do chính đáng mà tôi có thể thấy.

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