2009-11-23 19 views
37

Tôi sắp xếp ra một số vấn đề về bộ nhớ với ứng dụng iPhone của mình và tôi vừa mới suy nghĩ về một số vấn đề cơ bản. Nếu tôi thiết lập một ivar và không bao giờ kết thúc bằng cách sử dụng nó trong tuổi thọ của đối tượng của tôi, khi tôi gọi dealloc trên nó, điều đó sẽ gây ra một vấn đề? Ví dụ.Các biến mẫu có được đặt thành nil theo mặc định trong Objective-C không?

@interface testClass { 
    id myobject; 
} 
@property (nonatomic, retain) id myobject; 
@end 

@implementation testClass 
@synthesize myobject; 
- (id)init { 
    ... 
    // Do I have to set myobject to nil here? 
    // So if myobject isn't used the dealloc call to nil 
    // will be okay? Or can you release the variable without 
    // having set every object to nil that you may may not use 
    ... 
} 

... 

// Somewhere in the code, myobject may be set to 
// an instance of an object via self.myobject = [AnObject grabAnObject] 
// but the object may be left alone 

... 

- (void)dealloc { 
    [myobject release]; 
    [super dealloc]; 
} 
@end 
+0

Mike Abdullah: Tôi đã thực sự thay đổi trong chỉnh sửa của tôi. –

+0

Ah phải, do đó, biến bình thường được tạo ra trong một hàm không được đặt thành 0/nil khi bạn khai báo chúng? Chỉ các biến mẫu. Vì vậy, nó là chính xác mà các biến bình thường sẽ chỉ chứa 'rác' cho đến khi bạn rõ ràng đặt nó vào một cái gì đó? –

+0

Điều đó đúng. –

Trả lời

0

tôi thấy rằng nó là thực hành tốt để luôn đặt những ivars để nil trong phương pháp init. Bằng cách đó, bạn hoàn toàn chắc chắn rằng cuộc gọi của bạn để release trong destructor không thể gây ra vấn đề.

Nếu nó chỉ ra rằng Mục tiêu-C tự động đặt chúng thành nil và vì lý do nào đó bạn thấy mình bị tắc nghẽn tốc độ có thể được cải thiện bằng cách xóa những bài tập đó (rất khó), thì bạn có thể lo lắng về việc xóa chúng. Trong khi đó, để họ ra đi tất cả để nil và ngủ dễ dàng hơn :)

update: BJ Homer và Chuck đã chỉ ra rằng ivars sẽ tự động được thiết lập để không, vì vậy bây giờ nó đi xuống đến một quyết định Phong cách.

+3

Bạn có thể chắc chắn một trong hai cách. Chỉ cần một cách mà phương pháp init của bạn có đầy đủ các bài tập vô dụng. – Chuck

+0

Cảm ơn câu trả lời của bạn :-) –

+0

Mã tốt nhất là mã bạn không phải viết. Nếu một ngôn ngữ đảm bảo, hãy sử dụng chúng. Nếu bạn bắt đầu nghi ngờ tài liệu về các khái niệm cơ bản của ngôn ngữ (như làm trống rỗng) thì bạn đang ở trong một lỗ thỏ thật. – occulus

11

Có, ivars are always initialized to 0/nil/NULL/NO/etc.

Tuy nhiên, nếu nó giúp bạn hiểu điều gì đang diễn ra, hãy thực hiện. Tác động hiệu suất là không đáng kể. Bạn không cần phải làm điều đó, nhưng nó sẽ không gây ra bất kỳ vấn đề nếu bạn làm.

+10

Tôi không thấy làm thế nào lãng phí, mã dự phòng là thực hành tốt. Bạn có chắc chắn đặt tất cả biến cục bộ của mình thành cùng một giá trị nhiều lần trong một hàng chỉ để làm cho nó thực sự rõ ràng không? – Chuck

+11

Không. Đặt biến cục bộ nhiều lần sẽ làm giảm độ rõ ràng của mã và tăng sự nhầm lẫn. Rõ ràng việc thiết lập một ivar làm tăng sự rõ ràng, và một thành viên mới của nhóm ít quen thuộc hơn với objc hiểu dễ dàng hơn những gì đang xảy ra. Mã rõ ràng là quan trọng hơn việc giảm "lãng phí" mã. –

+2

Các nhà phát triển Objective-C nên làm quen với việc không khởi tạo các ivars. Do các phương thức 'init' zeroing thường có thể được bỏ qua hoàn toàn, đó là một điều tốt. Nếu các nhà phát triển vẫn đang học, họ không nên học khái niệm này từ mã nhưng từ một cuốn sách, người hướng dẫn, SO hay bất cứ điều gì. Họ sẽ không học khái niệm này bằng cách đọc mã dự phòng. –

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