2009-09-13 27 views
15

Sau khi nhả các đối tượng tốt nhất là đặt con trỏ thành nil? Đó là những gì tôi đã làm, chỉ muốn hỏi nếu thực hành tốt, cần thiết hoặc quá mức cần thiết của nó?Đặt con trỏ thành 0 sau khi thả?

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    [super dealloc]; 
} 
@end 

.

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    planetName = nil; 
    [super dealloc]; 
} 
@end 

cổ vũ -gary-

Trả lời

20

Phụ thuộc vào phạm vi của biến chứa con trỏ. Tôi luôn đặt con trỏ thành nil nếu chúng tiếp tục tồn tại trong phạm vi, chỉ trong trường hợp tôi đang gọi biến đó ở một nơi khác. Nếu không, có một nguy cơ mà tôi sẽ truy cập vào một vị trí bộ nhớ có chứa một đối tượng mà bây giờ được phát hành.

Nhưng nếu biến nằm ngoài phạm vi, thì biến đó cũng sẽ không được sử dụng, do đó gán nil cho nó là quá mức cần thiết. Tuy nhiên, nó là một thực hành tốt để chỉ gán nil chỉ trong trường hợp người khác quyết định thêm mã vào mã của bạn và vô tình sử dụng biến một lần nữa trong phạm vi của nó nhưng sau khi nó được giải phóng.

+1

cảm ơn bạn, được đánh giá cao. – fuzzygoat

+0

Tôi đã thấy một số mã nơi mọi người đặt thành 0 trước rồi thả ra. Điều đó dẫn đến việc phát hành không có gì. Vì vậy, đối với những người đang tự hỏi nếu thứ tự quan trọng, có nó! – pnizzle

1

Nó được coi là thực hành tốt. Nếu bạn đặt con trỏ của mình thành nil sau khi phát hành chúng, thì trong trường hợp bạn sử dụng sai biến của mình tại điểm thực thi sau này, bạn sẽ gặp phải lỗi thích hợp.

6

Thông thường khi lập trình trong C/C++, tôi đặt nó thành rỗng. Tại sao? Bởi vì ngay cả khi bạn giải phóng bộ nhớ được chỉ, con trỏ vẫn giữ địa chỉ của bộ nhớ giải phóng đó. Nó có thể gây ra một vấn đề truy cập vi phạm nghiêm trọng trong mã như thế này:

if(myPointer != null) 
{ 
    doSomething(myPointer); 
} 

Nếu bạn đã đặt con trỏ của bạn để null, điều này sẽ không bao giờ xảy ra

0

Đôi khi điều này có thể rất quan trọng, như tôi vừa phát hiện ra. Tôi sử dụng một máy ảnh trong trò chơi của tôi mà giữ một con trỏ đến một mục tiêu chung chung. Nếu bạn quay trở lại menu chính từ một cấp độ thì nó sẽ xóa cấp độ từ bộ nhớ nhưng giữ cho các lớp máy ảnh và trò chơi.

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

Kể từ khi máy ảnh sẽ tồn tại lâu hơn so với mục tiêu, cách tốt nhất để thiết lập mục tiêu để nil, nếu không khi tải mức một lần nữa và bạn thiết lập một mục tiêu mới:

-(void) setTarget:(CCNode *)aTarget { 
    [target release]; 
    target = [aTarget retain]; 
    [self update:0]; 
} 

Nó sẽ sụp đổ vào đó phát hành nếu mục tiêu là rác và không phải là không. Gửi một tin nhắn đến nil là tốt, nhưng không phải để một số bộ nhớ rác tùy ý. Điều đó mang lại cho tôi một số EXC_BAD_ACCESS.

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