2013-01-22 72 views
9

Trong mục tiêu-c, tôi biết rằng một biến tĩnh (nên?) Giữ nguyên giá trị của nó trong suốt thời gian tồn tại của chương trình. Nhưng nếu nó lưu trữ một con trỏ, nó có được tính là mạnh trong ARC không? Tôi có thể phụ thuộc vào nó và được đảm bảo rằng trường hợp đó sẽ không bao giờ đi ra khỏi đống một khi tôi gán nó cho một biến tĩnh?Con trỏ tĩnh có phải là con trỏ mạnh không?

static ClassA* shared; 

-(id)init 
{ 
    if (self=[super init]) { 
     shared=self; 
    } 
    return self; 
} 

Trả lời

14

Có, bạn có thể dựa vào nó khi được chỉ định.

Các Transitioning to ARC Release Notes nhà nước:

Theo ARC, mạnh mẽ là mặc định cho các loại đối tượng.

và sau đó:

__strong là mặc định. Một đối tượng vẫn còn "sống" miễn là có một con trỏ mạnh mẽ với nó.

Cho con trỏ static của bạn tham chiếu đối tượng, nó sẽ vẫn "sống". Phạm vi của một con trỏ (cho dù toàn cầu, một con trỏ trên ngăn xếp hoặc một biến thể hiện) không có sự khác biệt.

+0

Tôi thực sự đang sử dụng con trỏ tĩnh này làm con trỏ toàn cục cho một phần của dự án của tôi (tôi biết biến toàn cầu là ác, nhưng ...); nếu nó nằm trong heap, làm thế nào tôi có thể thoát khỏi nó một khi tôi không muốn nó nữa? Lý tưởng nhất là ARC nên chăm sóc điều này như thể không có mã sử dụng biến này thì nó sẽ bị dealloced; nhưng sau đó có vẻ như biến tĩnh này sẽ làm hỏng mọi thứ lên – lynnard

+0

@ yulan6248 'nil' biến khi bạn không còn cần nó nữa. – JustSid

0

Có vẻ như bạn chỉ nên triển khai Singleton và sau đó bạn có thể loại bỏ nó bằng cách đặt dụ thành không.

+0

Nhưng nếu con trỏ tĩnh là một con trỏ mạnh, không có nghĩa là tôi chỉ có thể nil nó trong chính lớp singleton? Vì vậy, tôi phải thực hiện một phương pháp dành riêng cho việc này .. – lynnard

+0

Nếu bạn đang sử dụng ARC, bạn không thực sự quan tâm đến bộ sưu tập. Nếu bạn nil nó bộ nhớ mà nó đã được sử dụng sẽ nhận được khai hoang, phải không? – Rob

+1

Tôi nghĩ mình đang bối rối. Nếu biến tĩnh là một con trỏ mạnh, thì tôi cần đặt nó thành nil cho ARC để dealloc nó đúng; nhưng kể từ khi biến tĩnh chỉ hiển thị cho lớp singleton tôi phải nil nó bên trong lớp singleton ... Hay tôi sai? – lynnard

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