2009-10-01 19 views
7

Nếu tôi tạo một đối tượng mới bao gồm hai con trỏ đối tượng (xem bên dưới) khi đối tượng được tạo, con trỏ được đặt để trỏ tới không;Ok để phát hành một con trỏ thats nil?

Nếu (vì một lý do không mong muốn) Tôi không gán các con trỏ này và sau đó giải phóng chúng trong phương pháp dealloc của tôi là ok, tôi chắc chắn nó là, chỉ muốn kiểm tra?

- (void)dealloc{ 
    [name release]; 
    name = nil; 
    [thrust release]; 
    thrust = nil; 
    [super dealloc]; 
} 

gary

+2

Hãy nhớ gọi '[super dealloc]' ở cuối quá trình thực hiện 'dealloc' của bạn. – Jason

+0

Xin lỗi Jason, tôi đã biết điều đó, nhưng bằng cách nào đó nó đã bị mất trong việc cắt & dán. – fuzzygoat

Trả lời

22

gửi một thông điệp tới nil sẽ không gây ra một lỗi, vì vậy đây là tốt. Bạn cần phải chắc chắn rằng con trỏ thực sự là không - mặc dù gửi một thông điệp đến một con trỏ rác có thể sẽ gây ra lỗi.

7

Có, bạn có thể thực hiện việc này vì bạn có thể gửi tin nhắn một cách an toàn (chẳng hạn như release) đến nil và nó sẽ không làm gì cả.

1

Nếu bạn sử dụng tài sản accessor để tạo ra phương pháp get/set của bạn:

@interface rocketShip : NSObject { 
    NSString *name; 
    NSNumber *thrust; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *thrust; 

Và trong file .m của bạn:

@synthesize name; 
@synthesize thrust; 

Bạn có thể sau đó chỉ cần đặt biến của bạn để nil trong dealloc . Điều này trong thực tế sẽ gọi setter của bạn và giảm số lượng tham chiếu của một và dọn sạch mọi thứ.

+0

Vincent, đây là một điểm rất tốt, tôi chỉ đọc về @property & @synthesize ngay bây giờ. Tôi chỉ muốn có được trường học cũ thẳng trong đầu của tôi trước khi tôi hướng tới Objective-C 2.0 – fuzzygoat

+1

Như một làm rõ, bạn sẽ phải viết self.name = nil trong dealloc. Đơn giản chỉ cần đặt tên = nil sẽ là một rò rỉ ngoại trừ dưới GC. – sbooth

+3

Mặc dù nó sẽ hoạt động trong trường hợp đơn giản nhất, nhưng đề xuất của Vincent không phải là cách thực hành tốt nhất. Sử dụng 'self.name = nil' trong phương thức dealloc sẽ gọi phương thức setter của bạn. Nếu một lớp con (hoặc bạn) ghi đè phương thức setter này sao cho nó có tác dụng phụ hay phụ thuộc vào trạng thái instance, nó có thể bị ngắt khi được gọi từ dealloc, nơi trạng thái của instance không được xác định. Đó là * nhiều hơn * tốt hơn để gọi [tên phát hành]. –

0

Điều quan trọng trong Mục tiêu-C để phân biệt giữa các đối tượng và các biến. Bạn không thể giải phóng một con trỏ (giá trị của một biến), bạn chỉ có thể giải phóng một đối tượng (đối tượng mà con trỏ trỏ tới). Một con trỏ không có nghĩa là không có đối tượng, vì vậy các thông báo được gửi đến nil không làm gì (thường là an toàn).

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