2013-05-09 25 views
5

Nếu tôi viết -NSObject được phát hành, NSString, NSArray không?

NSObject *a = [[NSObject alloc] init]; // or UIView or something 
[a release]; 
NSLog(@"a = %@", a); // causes EXC_BAD_ACCESS, fine 

Nhưng, nếu tôi viết -

NSArray *a = [[NSArray alloc] init]; // or NSString or NSDictionary 
[a release]; 
NSLog(@"a = %@", a); // no crash, prints empty array or string 

Tại sao thứ hai trường hợp không gây truy cập xấu, vì nó được phát hành?

Trả lời

8

Truy cập đối tượng được phát hành không phải làm cho ứng dụng gặp sự cố ngay lập tức.

Lưu ý rằng ngay cả khi bạn nhả đối tượng, bộ nhớ vẫn ở đó một thời gian, với cùng nội dung. Bạn sẽ chỉ gặp sự cố nếu bộ nhớ đối tượng đã bị ghi đè bởi một số đối tượng khác. Và lưu ý rằng ngay cả với bộ nhớ bị ghi đè, bạn không phải gặp tai nạn. Bạn chỉ có thể nhận được một số hành vi rất lạ (ví dụ: khi đối tượng là NSString, nó có thể nhận được các nội dung khác nhau).

Về cơ bản, hành vi này hoàn toàn ngẫu nhiên. Sử dụng đối tượng được phát hành có thể khiến ứng dụng của bạn bị lỗi ngay lập tức hoặc trong 5 phút hoặc trong 2 giờ.

Chỉnh sửa: Nhờ Martin R để có nhận xét thú vị. Dường như một mảng được tạo bởi [[NSArray alloc] init], đó là mảng trống bất biến, trả về luôn luôn cùng một ví dụ. Điều đó có nghĩa là release của bạn sẽ không làm cho nó được deallocated. Tuy nhiên, hành vi này có thể dễ dàng thay đổi, có thể khác nhau giữa các trình biên dịch hoặc các phiên bản hệ điều hành.

+0

Bạn nhanh hơn tôi, tôi sẽ trả lời theo cùng một cách, nhưng tôi thậm chí không nhận được một từ nào được nhập. +1 – borrrden

+0

Nhưng phát hành NSObject hoặc UIView vv chắc chắn bị rơi ngay lập tức, trong khi NSArray hoặc NSString vv chắc chắn không bị rơi ngay lập tức. Vì vậy, một số khác biệt phải có trong bộ nhớ sử dụng, trường hợp phát hành của mảng hoặc chuỗi. Đó là gì? – user1559227

+0

Xem ** ngẫu nhiên **. Trong trường hợp này nó sẽ sụp đổ cho NSObject, nhưng không phải cho NSArray. Nếu bạn biên dịch với các tùy chọn khác nhau, nó có thể không hoạt động theo cách đó. Làm thế nào bộ nhớ được sử dụng bởi hệ điều hành khác nhau tùy thuộc vào nhiều yếu tố. Đó là sự khác biệt giữa * phát hành * và * deallocated * – borrrden

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