2011-01-05 4 views
7

Tôi có một lớp con của NSManagedObject, hầu hết các thuộc tính đều động (được tạo bởi đối tượng được quản lý), nhưng tôi có một vài thuộc tính trợ giúp đang được tạo ra như là @synthesize.iphone NSManagedObject - Cách thích hợp để deallocing?

Cách chính xác để phát hành các đối tượng này là gì ??

- (void)didTurnIntoFault 
{ 
    [self.randomVar release]; 
    [super didTurnIntoFault]; 
} 

hoặc

- (void)dealloc 
{ 
    [self.randomVar release]; 
    [super dealloc]; 
} 

Trả lời

11

Override didTurnIntoFault và thả chúng ở đó. Các đối tượng được quản lý không nhất thiết bị deallocated khi chúng bị lỗi.

Từ documentation:

Bạn đang nản lòng từ trọng dealloc hoặc finalizedidTurnIntoFault thường là một thời điểm tốt để xóa giá trị-một đối tượng quản lý có thể không được khai hoang một thời gian sau khi nó đã được biến thành một lỗi. Dữ liệu cốt lõi không đảm bảo rằng dealloc hoặc finalize sẽ được gọi trong tất cả các trường hợp (chẳng hạn như khi ứng dụng thoát); do đó bạn không nên sử dụng các phương pháp này bao gồm các tác dụng phụ cần thiết (như lưu hoặc thay đổi hệ thống tệp, tùy chọn người dùng, v.v.).

+1

Fyi cho những người như tôi bị nhầm lẫn với tên của ghi đè-- willTurnIntoFault không theo bất kỳ cách nào chỉ ra lỗi hoặc "lỗi", đó chỉ là thuật ngữ CoreData để lấy đối tượng ra khỏi lưu thông. – jpswain

6

Bạn có thể xem kỹ Hướng dẫn lập trình dữ liệu cốt lõi. Hai đoạn là của riêng phù hợp

Nếu bạn xác định tùy dụ biến, bạn nên dọn dẹp những biến trong didTurnIntoFault thay hơn dealloc hoặc hoàn thiện.

Bạn nên thường không ghi đè dealloc hoặc hoàn thiện để xóa thoáng thuộc tính và các biến khác. Thay vào đó, bạn nên ghi đè didTurnIntoFault.

4

[Đây phải là nhận xét thực sự vì tôi chỉ ra một vấn đề khác với câu hỏi, nhưng tôi muốn chức năng định dạng mã].

Không bao giờ làm điều này:

[self.randomVar release]; 

Đó giải phóng đối tượng được trỏ đến bởi Ivar ủng hộ bất động sản nhưng không làm cho con trỏ tự nil. Điều này có nghĩa là bạn bây giờ có khả năng có một con trỏ lơ lửng nếu kết quả phát hành trong đối tượng đang được dealloced. Hoặc làm điều này:

self.randomVar = nil; 

hay này

[randomVar release]; // assumes the property is backed by an ivar of the same name. 
randomVar = nil;  // can be omitted if you are in dealloc 

Các hình thức đầu tiên được ưa thích ở bất cứ đâu ngoại trừ trong dealloc.