2010-08-04 35 views
7

Tôi mới vào Objective-C (và stackoverflow) và tôi là một chút quay về thực tiễn tốt nhất liên quan đến tài sản.Thuộc tính trong dealloc: phát hành sau đó thiết lập để nil? hoặc chỉ đơn giản là phát hành

Sự hiểu biết của tôi là khi bạn hoàn thành xong một thuộc tính, bạn có thể tránh lỗi bằng cách giải phóng chúng và sau đó đặt ngay lập tức thành không sao cho các thông điệp tiếp theo cũng trả lại không thay vì ngoại lệ.

[myProperty release], myProperty = nil;

Tuy nhiên, khi nói đến dealloc cho thuộc tính 'sao chép' và 'giữ lại' thì có cần phải làm gì cả không? hoặc thực hiện đơn giản

[myProperty release] cắt? Ngoài ra, tôi có chính xác rằng tôi không cần phải phát hành 'gán' tài sản trong dealloc?

Cảm ơn!

Trả lời

17

Làm bản phát hành, nhưng đừng bận tâm thiết lập thành không. Thiết để nil qua setter @synthesized của bạn:

self.myProperty = nil 

sẽ phát hành giá trị cũ của bạn như một phần của tái bổ nhiệm (mặc dù như đã nêu trong các ý kiến, có thể có tác dụng phụ không mong muốn), nhưng chỉ đơn giản là gán nil để biến thành viên của bạn:

myProperty = nil 

sẽ không.

[myProperty release] 

là tất cả những gì bạn cần.

(và bạn là chính xác về "gán" tài sản.)

+3

+1 rằng bản phát hành là tất cả những gì bạn cần, nhưng tôi thận trọng khi sử dụng 'self.myProperty = nil' trong' dealloc '(nó có thể kích hoạt các phương thức KVO và thông báo cho các nhà quan sát để thử và truy cập một đối tượng được phân bổ một phần ...) –

+4

Như Dave đã nói, thực hành được khuyến cáo hiện tại (bởi Apple) không sử dụng các trình truy cập để gán nil (và do đó giải phóng) trong dealloc. Nó không chỉ có thể kích hoạt các phương thức KVO, mà bộ truy cập đã đặt có thể đã bị ghi đè bởi một lớp con. – JeremyP

+1

Cũ hơn và khôn ngoan hơn ... thực hành tốt nhất có vẻ là sử dụng self.myProperty = nil cho thuộc tính đầu ra IB trong viewDidUnload. Điều này cho phép viewController thiết lập lại hệ thống phân cấp khung nhìn nếu nó đã được tháo dỡ bởi một bộ nhớ thấp. – averydev

0

@ Dave DeLong và JeremyP: Tôi nghĩ chúng ta có thể nói “sử dụng tin nhắn thừa hưởng (trực tiếp hoặc gián tiếp bởi một, kêu gọi một số phần từ siêu) whil“ xây dựng "một đối tượng (bởi init ..., mới ... hoặc sao chép ...) giống như xây dựng một ngôi nhà và đặt mái nhà trên nó trong khi không ai chắc chắn, nếu tầng hầm allready là có. Và làm như vậy trong khi dealloc có thể tương đương với việc phá bỏ căn nhà đó, bắt đầu bằng việc đập xuống các bức tường nền móng, không chắc chắn liệu có nằm trong hầm của nó hay không ”.

Trong khi sử dụng các phương pháp không có bất kỳ thừa kế nào cũng có thể làm điều này - nhưng nếu bạn là của riêng bạn, bạn có thể (và có) để kiểm soát nó.

Greetings

0

@ Dave DeLong: Khi phương pháp dealloc của một đối tượng được thực hiện, các đối tượng không còn được sử dụng. Tất cả các quan sát viên của kvo phải được loại bỏ vào thời điểm đó, nếu không, một sự suy yếu sẽ bị loại bỏ. Và dù sao - ngay cả NẾU một người quan sát sẽ thấy sự thay đổi thì đối tượng sẽ vẫn tồn tại (ít nhất là một phần).

Người truy cập bị ghi đè là đối số đúng tôi nghĩ. Tuy nhiên, đối với các lớp học của riêng bạn, nó vẫn có thể đơn giản hơn để sử dụng accessor. Đặc biệt khi sử dụng các phương pháp tổng hợp, bạn biết ngữ nghĩa nhưng không có chi tiết về người truy cập ...

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