2011-10-17 37 views
5

Tôi cần kiểm tra xem tôi đã phát hành biến trong mục tiêu-c chưa. Tôi cố gắng kiểm tra nếu nó thay đổi để null:Làm cách nào để kiểm tra xem một đối tượng có được phát hành không?

//Checks if buildview is null and returns respective output 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//allocates memory and initalizes value 
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//Releases the view 
[BuildView release]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

Kết quả là:

Build View Value (pointer): Null 
Build View Value (pointer): Not Null 
Build View Value (pointer): Not Null 

Có cách nào dễ dàng hơn để kiểm tra xem nó được deallocated?

+0

gì bạn dường như được hỏi không phải là nếu đối tượng đã được phát hành, nhưng đúng hơn là nếu nó đã được deallocated. – PengOne

+1

có thể trùng lặp của [Làm thế nào để xác định xem tôi có một con trỏ để phát hành đối tượng?] (Http://stackoverflow.com/questions/12280799/how-to-determine-if-i-have-a-pointer-to- phát hành -object) – OrangeDog

Trả lời

4

Bạn có thể có nghĩa là deallocated (bị hủy), không được phát hành. Là phát hành không có nghĩa là đang được deallocated, đó là điểm tham chiếu được tính toán quản lý bộ nhớ. Được phóng thích không phải là trạng thái, bạn không thể kiểm tra nó; bị phá hủy.

Nếu bạn có nghĩa là deallocated, sau đó không có, không có. Nó được gọi là tham chiếu yếu và Mục tiêu-C không có chúng để tính tham chiếu. Khi một đối tượng được deallocated, không có gì được tự động thực hiện cho con trỏ tới nó; chúng trở thành con trỏ lơ lửng.

Một kỹ thuật là để đối tượng gửi thông báo trong quá trình deallocation, để mọi thứ giữ con trỏ có thể đặt lại thành không.

Thông thường, bạn phải thiết kế chương trình theo cách không sử dụng con trỏ đối tượng sau khi bạn gọi release trên đó. Trong mã mẫu bạn đã cung cấp, bạn không được sử dụng lại BuildView cho bất kỳ điều gì khác ngoại trừ gán giá trị mới.

+0

Cần lưu ý rằng, vì mục đích lịch sử, câu trả lời này không còn đúng nữa. Objective-C có các tham chiếu yếu, và trên thực tế, nó luôn luôn có, với đủ thời gian chạy hack. Tuy nhiên, đối với phiên bản chính thức, chúng yêu cầu iOS 5 trở lên. –

6

Thông thường, bạn không cần phải kiểm tra xem con trỏ có trỏ đến đối tượng được phân bổ không: Bạn nên biết :) Biến số chỉ cần giữ địa chỉ bộ nhớ. Nếu nội dung của bộ nhớ mà biến được trỏ đến được deallocated, giá trị của biến của bạn (giữ địa chỉ) sẽ không được thiết lập một cách kỳ diệu là nil hoặc NULL. Vì vậy, bạn nên suy nghĩ lại về thiết kế của mình nếu bạn thấy cần thiết để kiểm tra xem con trỏ có trỏ đến không gian địa chỉ đã được phát hành/deallocated hay không.

Trong thời gian phát triển, bạn có thể thực hiện những việc như kích hoạt NSZombies hoặc sử dụng Công cụ để tìm hiểu nơi các đối tượng đang được cấp phát hoặc phân phối lại.

Cập nhật 2015/06/26: Khi bạn đang sử dụng weak con trỏ trên OS X 10.7 trở lên và trên iOS 5 trở lên, chúng sẽ tự động được thiết lập để nil khi đối tượng tham chiếu được phát hành. Xem https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References

0

Sau khi phát hành một đối tượng, giá trị của đối tượng đó sẽ không được đặt thành nil.

+2

gọi 'retainCount' trên đối tượng bị hủy sẽ cho bạn sự cố hoặc hành vi không xác định khác, không phải là 0. – hamstergene

+0

Thực tế, kết quả có khả năng nhất trong mẫu mã cụ thể đó là 'retainCount' sẽ trả về 1 ** ngay cả khi nó được deallocated **! – Chuck

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