2012-07-02 17 views
7
NSString *str = [[[[NSString alloc]init]autorelease]autorelease]; 
str = @"hii"; 
NSLog(@"%@",str);  

Có thể bất kỳ ai giúp tôi nói về mã này. Tự động phát hiện đối tượng hai lần những gì sẽ xảy ra. Khi tôi chạy mã tôi đã không nhận được bất kỳ zombie. tại sao nó như vậy.Tự động phát hành hai lần một đối tượng

Trả lời

12

Đối tượng được công bố hai lần khi các hồ bơi autorelease bị phá hủy, mà có lẽ sẽ được vào cuối phiên chạy vòng lặp. Tại sao nó không sụp đổ là, NSString trả về đơn cho một số trường hợp, ví dụ chuỗi rỗng bạn tạo hoặc chuỗi ký tự (bạn nên NOT phụ thuộc vào nó, đó chỉ là những gì đang xảy ra!), Các đối tượng này sẽ không deallocated và đây là lý do tại sao bạn không nhận được một zombie.

+0

Điều gì xảy ra nếu nó không phải là một chuỗi, nhưng là một lớp khác? – nekonari

3

Trước hết không có lý do gì để gọi tự động phát lại hai lần.

Khi một đối tượng được đánh dấu là tự động trả lời, việc gọi lại tự động lại trên đối tượng đó sẽ bị bỏ qua. Xem https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

Nhưng trong exmaple bạn được đăng bạn đang tạo một chuỗi rỗng:

NSString *str = [[[[NSString alloc]init]autorelease]autorelease]; 

Sau đó bạn gán một chuỗi khác với nó:

str = @"hii"; 

Điều này có nghĩa rằng chuỗi đầu tiên bạn phân bổ chỉ là sẽ bị rò rỉ, bạn đã tự động phát hành nó để nó sẽ được làm sạch vào cuối. Nhưng không có lý do để phân bổ chuỗi trong nắm tay.

Bạn chỉ có thể làm:

NSString *str [email protected]"hii"; 
NSLog(@"%@",str); 
+4

"tự động gọi lại trên đó một lần nữa sẽ bị bỏ qua" không đúng sự thật. Các đối tượng được thêm hai lần vào hồ bơi autorelease, và sẽ được phát hành hai lần khi hồ bơi được thoát nước. Đây là tài liệu: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html –