2009-02-25 32 views
5

Nếu tôi có một NSMutableString nhưNSMutableString và nil cho quản lý bộ nhớ

NSMutableString *foo = [[NSMutableString alloc] init]; 

nếu tôi Nil ra đối tượng, foo = nil, làm thế càng thấp giữ lại đếm 1, do đó hiệu quả giải phóng bộ nhớ? Tôi có cần phải phân bổ lại foo từ heap tại thời điểm này để có thể sử dụng nó không?

Trả lời

8

Vui lòng đọc the basic documentation. Đặt biến số foo thành 0 không làm gì đối với nội dung trước đó của nó. Hãy nhớ rằng, foo chỉ là một con trỏ đến một đối tượng; để sử dụng nó, bạn phải làm cho nó trỏ đến một đối tượng hợp lệ. Chỉ để làm cho nó không trỏ đến đối tượng đó nữa thì không giải phóng đối tượng.

+1

OP có thể bị nhầm lẫn biến với thuộc tính: nếu foo là thuộc tính (không phải là biến), hãy đặt obj.foo = nil, sẽ giải phóng số tham chiếu. –

2
làm giảm số lần giữ lại xuống 1, do đó giải phóng bộ nhớ hiệu quả?

Không

Bạn nên sử dụng

[foo release] 
0

foo = nil; sẽ không làm giảm số lượng giữ của đối tượng. Nó sẽ chỉ làm cho foo điểm hư không thay vì ở đối tượng. Để giảm số lượng giữ lại, bạn sẽ phải nói [foo release];.

5

Gán một biến không ảnh hưởng đến giá trị trước đó. Số lượng giữ lại chỉ được giảm xuống release.

Bạn nên đọc số Cocoa memory management guidelines của Apple. Hệ thống đếm tham chiếu của Cocoa không phải là khó, nhưng nó là thứ bạn phải học, và nếu bạn không học một cách chính xác, chương trình của bạn sẽ có rất nhiều lỗi tinh vi sẽ khiến bạn phát điên.

4

Điều mọi người đã nói ở trên hoàn toàn đúng. Bạn cần một bản phát hành trong đoạn mã đó.

Tuy nhiên, điều quan trọng cần lưu ý rằng gán cho một tài sản sẽ hạ giữ lại đếm nếu đó là điều phải làm. Đó là:

foo = nil;   // doesn't lower 
bar.foo = nil;  // probably does 

Thuộc tính trông giống như biến thông thường, nhưng chúng thực sự không; họ xử lý việc quản lý bộ nhớ của mình một cách thông minh. Đó là điều cần lưu ý khi bạn làm việc với họ.

+0

“Thuộc tính… xử lý quản lý bộ nhớ của riêng chúng một cách thông minh.” Giả sử bạn khai báo chúng một cách chính xác, tất nhiên. Nếu bạn khai báo nó với @property (assign), nó sẽ không phát hành. –

+0

Điều này là đúng, nhưng giả định là nếu bạn khai báo một thuộc tính với (gán), nó thực sự không nên được giữ lại (vì nó là một đại biểu, ví dụ). Nói chung, bạn nên giả định rằng các thuộc tính của lớp khác quản lý chính xác bộ nhớ của các giá trị của chúng. –