2011-06-11 13 views

Trả lời

36

tôi giả sử bạn có nghĩa là một con trỏ đối tượng tĩnh, chẳng hạn như static NSString *foobar;.

Biến như vậy thực sự có thời gian miễn là ứng dụng, nhưng các biến mà chúng ta đang nói đến là con trỏ chỉ. Trong Objective-C, các đối tượng luôn được phân bổ động, và vì vậy chúng ta luôn luôn giải quyết chúng với một con trỏ đến kiểu của chúng, nhưng dữ liệu cơ bản cho một đối tượng vẫn còn hiện diện trong tự động phân bổ màu xanh hoang dã.

Bạn vẫn phải giữ lại đối tượng bởi vì, trong khi con trỏ đối tượng sẽ không bao giờ nằm ​​ngoài phạm vi, đối tượng có thể được xử lý giống như bất kỳ đối tượng nào khác, và vì vậy con trỏ của bạn sẽ chỉ đến rác, hoặc tệ hơn, một vật không liên quan khác.

+4

Jonathan là đúng! Điều gì sẽ xảy ra nếu đối số được truyền trong một nhóm tự động trả lời và sẽ được tự động phát hành ngay sau khi phương thức được gọi? -> truy cập con trỏ tĩnh sẽ gây ra lỗi (EXEC_BAD_ACCESS chủ yếu) –

+0

Martin, sửa nhỏ: đó là EXC_BAD_ACCESS (EXC ngoại trừ). – bneely

+0

Cảm ơn bạn đã giải thích rõ ràng – Stavash

16

Một phiên bản đơn giản của câu trả lời chấp nhận Jonathan Grynspan của:

Các retain không dành cho những biến trỏ tới một đối tượng. Biến đó sẽ tồn tại mãi mãi vì nó tĩnh. retain là đối tượng mà biến trỏ đến. Nếu không có retain đối tượng có thể (và nên) được deallocated. Sau đó, bạn đã có một biến trỏ đến một điều sẽ gây ra một sigabrt. Biến này trỏ đến hư không được gọi là "con trỏ lơ lửng".

Đối với bối cảnh ARC, điều tốt nhất để làm là khai báo biến tĩnh như mạnh mẽ, vì vậy một cái gì đó như thế này:

static ThatClass * __strong thatStaticVariable; 

Điều này đảm bảo rằng đối tượng mà thatStaticVariable điểm đến sẽ là một đối tượng hợp lệ (tức là , không bao giờ được deallocated) một khi được giao. Tuy nhiên, bạn không thực sự cần những từ khóa __strong ở tất cả, bởi vì đó là mặc định (để sayeth the docs, nhờ @zpasternack), vì vậy chỉ cần sử dụng

static ThatClass *thatStaticVariable; 

và bạn tốt.

Lưu ý: mãi mãi = trong khi ứng dụng đang chạy

+5

Trong ARC, bất kỳ đối tượng có thể lưu giữ nào mà không có vòng loại quyền sở hữu rõ ràng là hoàn toàn __strong, vì vậy hãy nói [docs] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference). – zpasternack