2010-01-16 67 views
11

Tôi vẫn chưa hiểu rõ về việc phát hành và tự động phát hành. Sự khác biệt giữa hai người trong số họ là gì? Tôi có mã này. Đối với kết nối facebook. Đôi khi tôi gặp sự cố khi đăng nhập vào Facebook, tôi nghi ngờ có thể vì tôi không giải phóng đối tượng một cách độc đáo.? Thanks cho bất kỳ giúpSự khác biệt giữa phát hành và tự động phát hành là gì?

if (_session.isConnected) { 
     [_session logout]; 
    } else { 
     FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease]; 
     [dialog show]; 
    } 

Trả lời

20

Memory Management Programming Guide for Cocoa sẽ sớm trở thành người bạn thân nhất của bạn. Tóm lại, các cá thể đối tượng trong Cocoa là bộ nhớ được quản lý bằng cách sử dụng tính toán tham chiếu (trừ khi, tất nhiên bạn đang sử dụng bộ sưu tập rác trên OS X). Một đối tượng cho biết rằng nó muốn 'giữ lại' quyền sở hữu trong một trường hợp khác - giữ cho nó không bị phân phối - bằng cách gửi một thông báo -retain. Một đối tượng cho biết rằng nó muốn phát hành sở thích đó bằng cách gửi một cá thể khác một thông báo -release. Nếu số lượng đối tượng có 'giữ lại' và quyền sở hữu trong một đối tượng giảm xuống 0 (tức là khi người cuối cùng của trường hợp sở hữu gửi một thông báo -release), trường hợp có số lần giữ lại 0 được deallocated.

Đôi khi thuận tiện để nói "Tôi muốn phiên bản này được phát hành một thời gian trong tương lai". Đó là mục đích của -autorelease. Gửi thông báo -autorelease thêm bộ thu vào số NSAutoreleasePool hiện tại. Khi hồ bơi đó được thoát nước, nó sẽ gửi một thông báo -release cho tất cả các trường hợp trong hồ bơi. An NSAutoreleasePool được tạo tự động khi bắt đầu mỗi lần lặp của vòng lặp chạy của mỗi luồng và thoát ra ở cuối của lần lặp đó. Vì vậy, bạn có thể làm một cái gì đó như thế này trong một phương pháp:

- (id)myMethod { 
    return [[[MyObject alloc] init] autorelease]; 
} 

Người gọi của phương pháp này sẽ liên lạc lại một thể hiện rằng họ có thể -retain nếu họ muốn giữ nó. Nếu họ không giữ lại nó, nó sẽ dính vào xung quanh ít nhất cho đến các hồ bơi autorelease kèm theo được để ráo nước:

- (void)someOtherMethod { 
... 

id instance = [obj myMethod]; 
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns 

} 
+0

liên kết đến hướng dẫn lập trình quản lý bộ nhớ dường như bị hỏng; phiên bản iOS có thể được tìm thấy tại https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – CCJ

3

Theo Memory Management Programming Guide for Cocoa:

Phương pháp autorelease, được xác định bởi NSObject, đánh dấu sự thu cho sau này phát hành. Bằng cách tự động phát hiện đối tượng — tức là, bằng cách gửi một thông báo tự động trả lời — bạn tuyên bố rằng bạn không muốn sở hữu đối tượng vượt quá phạm vi mà bạn đã gửi tự động.

Ngoài ra:

Phương pháp autorelease do đó cho phép mọi đối tượng sử dụng các đối tượng khác mà không lo lắng về việc xử lý của họ.

4

thảo luận nền:

Objective-C là tài liệu tham khảo tính, vì vậy các đối tượng được xóa khi tham khảo đếm đến 0.phát hành giảm tham chiếu đếm ngay lập tức, autorelease giảm nó khi autorelease bơi được popped

khi sử dụng:

sử dụng autorelease khi phân bổ đối tượng nếu

  • bạn không cần nó sau khi chức năng hiện tại
  • nó sẽ được retiained bởi một số objet/chức năng khác và sẽ được phát hành sau đó bằng mã giữ lại
  • khi logic của chức năng hiện tại là khó khăn, vì vậy bạn sẽ phải gửi bản phát hành trong một chục địa điểm khác nhau trước khi thực hiện một sự trở lại

sử dụng "bằng tay" phát hành

  • để trở lại một trước giữ lại (trong trường hợp bạn đang thực hiện một thư viện)
  • nếu bạn cần điều khiển chính xác của giải phóng đối tượng (ví dụ họ sử dụng rất nhiều bộ nhớ hoặc hồ bơi autorelease sẽ không được popped trong một thời gian)

nhưng thực sự freand tôi:

  • đọc Memory Management Programming Guide for Cocoa theo đề nghị của Barry và chạy mã của bạn với các công cụ (zombie và rò rỉ) thường xuyên để bắt bất kỳ và gần như tất cả các lỗi quản lý bộ nhớ.

Erik

7

Releasing phương tiện bạn phát hành đó ngay lập tức. Tự động phát hành có nghĩa là bạn muốn biến được phát hành trên nhóm tự động phát hành tiếp theo.

Bạn sử dụng tự động phát hành khi bạn muốn giữ lại biến nhưng không muốn tạo rò rỉ bộ nhớ. Bạn sử dụng bản phát hành khi bạn không cần biến nữa.

mẫu:

- (NSNumber *)return5 { 
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5]; 
    [result autorelease]; 
    return result; 
} 

Tại sao chúng ta sử dụng autorelease đó?

Nếu chúng tôi sử dụng [phát hành kết quả] thay vào đó, kết quả biến sẽ bị hủy tại thời điểm đó. Điều đó có nghĩa là giá trị trả về sẽ là rác.

Nếu chúng tôi không giải phóng chút nào, biến số result sẽ bị giữ TRỪ KHI phát hiện rò rỉ bộ nhớ.

Chúng tôi có thể thông báo cho mọi người gọi đến hàm để giải phóng kết quả nhưng điều đó sẽ là một cơn đau đầu và dễ bị lỗi.

Vì vậy, chúng tôi sử dụng tự động phát hành. Chúng tôi đánh dấu biến được phát hành trên nhóm tự động phát hành tiếp theo. Về cơ bản chúng tôi đánh dấu các biến được phát hành gần phân bổ. Do đó việc phân bổ thần chú được ghép nối với bản phát hành trong cùng một hàm giữ tất cả thời gian.

Thực ra, bạn sẽ làm tốt việc thay đổi tất cả bản phát hành thành tự động phát hành. Việc sử dụng bộ nhớ của bạn sẽ không hiệu quả, tuy nhiên, hiệu quả là tối thiểu. Tất cả các biến, trong tất cả các ngôn ngữ lập trình được tự động phát triển hiệu quả.

Dù sao, hãy sử dụng ARC.

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