2009-05-21 28 views
5

Im khá mới để lập trình khách quan c và phát hành các đối tượng là nhức đầu lớn nhất của tôi. Tôi luôn luôn nghi ngờ về những gì cần phải được phát hành, và thời gian của tôi tôi đã kết thúc phát hành biến sai và nhận được một vụ tai nạn BAD EXEC. Tôi đã đọc hướng dẫn của apple về quản lý bộ nhớ, nhưng tôi không thể luôn đi từ ví dụ của họ đến mã của tôi.Phát hành mục tiêu-C của người độc thân

Một trong những tình huống này là những người độc thân của tôi (Im a big Singleton guy).

tôi có một định nghĩa như thế này:

static Configuration* _instance; 

+(Configuration*)getInstance{ 
    if (_instance == NULL){ 
     _instance = [Configuration alloc]; 
     [_instance initConfig]; 
    } 
    return _instance; 
} 

Trong mã của tôi, tôi sử dụng nó như thế này:

//Store configuration  
Configuration* conf = [Configuration getInstance]; 
conf.userName = self.userName.text; 
conf.cellPhone = self.phoneNumber.text; 

Tôi có cần phải nhả "conf" biến?

Khi nào tôi nên giải phóng _instance?

Vì Im đang chạy mã này trên iPhone, điều gì sẽ xảy ra với các vars mà tôi không phát hành? liệu chúng có ảnh hưởng đến hiệu suất của iPhone không?

Trả lời

8

Khi bạn tạo cá thể Cấu hình với "_instance = [Phân bổ cấu hình]; [_instance initConfig];" nó có một số người giữ lại từ cuộc gọi phân bổ. Nếu bạn phát hành conf sau "conf.cellPhone = self.phoneNumber.text;" sau đó nó sẽ được deallocated tại thời điểm đó.

Khi bạn lần đầu tiên tạo đối tượng có phân bổ hoặc sao chép hoặc có thể tắtĐối tượng, nó sẽ có số lần giữ lại 1. Mỗi cuộc gọi để giữ lại số tăng được giữ lại bằng một. Mỗi cuộc gọi để phát hành giảm mà giữ lại đếm bằng 1. Gọi autorelease chỉ có nghĩa là "Gọi cho tôi sau này", vì vậy nếu giữ lại và phát hành giống như kiểm tra, autorelease giống như hẹn hò trong tương lai một kiểm tra.

Mã của bạn truy cập vào cấu hình singleton không giữ lại, sao chép hoặc sao chép có thể thay đổi được, do đó không nên phát hành mã đó.

Khi mã của bạn được viết ngay bây giờ, đối tượng Cấu hình sẽ không bao giờ được phát hành và sẽ tồn tại cho toàn bộ thời gian của ứng dụng, thường là những gì bạn muốn với một singleton.

+0

bạn có thể xem điều này không, tôi đoán bạn có thể giúp tôi http://stackoverflow.com/questions/6928028/objective-c-alloc-release-error-in-singleton-class – Spring

2

Bạn không cần phải giải phóng biến số conf vì bạn chưa lưu giữ.

Theo quy tắc chung, bạn cần phải cân bằng các cuộc gọi đến các phương thức tăng số lần giữ lại với các phương pháp giảm số lượng cuộc gọi đó.

init, retain, tăng nó, trong khi release giảm giá trị này.

Phiên bản chính được phát hành khi lớp học được tải xuống, vì vậy tôi nghĩ bạn không cần phải quan tâm đến nó.

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