2009-03-19 18 views
7

Nếu tôi khai báo các biến lớp trong Objective-C, khi nào bộ nhớ được giải phóng?biến lớp khách quan-c: khi nào được gọi là dealloc?

Nếu giao diện của tôi là:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

Và trong việc thực hiện, tôi tuyên bố:

static NSString instanceCount; 

Làm thế nào để giải phóng biến cấp lớp này? tức là khi nào dealloc được gọi cho các biến lớp trong Objective-C?

+3

Chỉ cần bắt gặp câu hỏi này khi học Obj-C. Apple dường như gợi ý rằng không có thứ gì như "biến lớp" và những gì bạn đã định nghĩa trong giao diện là một phương thức * lớp *, khác biệt với biến tĩnh và do đó cần được xác định trong quá trình triển khai. Biến tĩnh được giới hạn trong phạm vi của tệp * triển khai *, không phải chính lớp đó. Có thể đây là một câu hỏi nhỏ nhưng nó làm tôi bối rối: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

Trả lời

10

Câu trả lời ngắn cho câu hỏi của bạn là: "khi chương trình thoát."

Biến tĩnh được cấp phát ngay từ đầu chương trình của bạn, trước khi bắt đầu chức năng main(). Tương tự, chúng sẽ được phát hành vào cuối chương trình của bạn, ngay sau khi thoát khỏi main(). Quản lý bộ nhớ này được xử lý bởi thời gian chạy Objective-C, và tất cả xảy ra đằng sau hậu trường.

Nếu bạn đang cố gắng theo dõi hành vi này, có thể bạn sẽ không có nhiều may mắn. Ví dụ, nếu bạn đã làm như sau trong một lớp tùy chỉnh, và sau đó sử dụng lớp đó như là một thành viên tĩnh của lớp khác:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

Bạn sẽ không bao giờ thấy thông báo này xuất hiện trong nhật ký. Có một vài lý do cho việc này. Một, các biến mà NSLog() yêu cầu có thể đã được deallocated như một phần của thủ tục tắt máy bình thường. Và hai, vì hệ thống thời gian chạy có thể đơn giản giải phóng tất cả bộ nhớ còn lại trong một lần chụp, mà không cần phải gọi phương thức dealloc.

Điều này có thể có vấn đề nếu lớp tùy chỉnh của bạn thực hiện điều gì đó quan trọng trong phương thức dealloc của nó. Nếu trường hợp này xảy ra, hãy cân nhắc viết phương thức tùy chỉnh cleanup mà bạn gọi cho các đối tượng này ngay trước khi thoát khỏi chương trình.

+0

chưa kể thực tế rằng dealloc là một phương pháp thể hiện và có thể được gọi là 0 hoặc 100 lần cho lớp học – cobbal

+0

Hmm, vâng, nhưng tôi đã nghĩ về phương pháp này trong một đối tượng được sử dụng như một thành viên tĩnh của một lớp khác. Tôi đã (hy vọng) xóa nó trong câu trả lời của tôi. Cảm ơn vì chỉ ra điều ấy! –

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