thể trùng lặp:
Why do weak NSString properties not get released in iOS?Objective-C: attritube yếu không làm việc như mong đợi
Tôi là một newbie để Objective C và tôi đã có một số câu hỏi mà tôi không thể tự trả lời. Tôi có một khối mã cho biến thử nghiệm __weak (Tôi đang sử dụng ARC, tất nhiên):
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
myString = nil; //<-- release the NSString object
NSLog(@"string: %@", weakString);
Sản lượng của các mã trên được như mong đợi, vì weakString là một biến yếu:
2013-01-02 11:42:27.481 ConsoleApp[836:303] string: (null)
Nhưng khi tôi sửa đổi mã này:
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
NSLog(@"Before: %@", weakString); //<--- output to see if the __weak variable really works.
myString = nil;
NSLog(@"After: %@", weakString);
Đầu ra là hoàn toàn không phải là điều tôi mong đợi:
2013-01-02 11:46:03.790 ConsoleApp[863:303] Before: John
2013-01-02 11:46:03.792 ConsoleApp[863:303] After: John
Kết quả của NSLog sau phải là (nil) thay vì "John". Tôi đã cố gắng để tìm kiếm trong nhiều tài liệu nhưng tôi đã không tìm thấy câu trả lời cho trường hợp này. Ai đó có thể đưa ra giải thích hợp lý không? Cảm ơn trước.
@jrturton: Tôi không nghĩ đây là bản sao của câu hỏi được liên kết. Vấn đề ở đó là sử dụng 'NSString' không đổi mà không tham gia vào việc quản lý bộ nhớ thông thường vì tối ưu hóa hiệu suất. Áp phích ở đây sử dụng 'initWithFormat' để tránh chính xác vấn đề này. – zoul
Tôi đã đọc (nhưng không thể tìm thấy thời gian này) một lần nữa của việc này, nơi một số tối ưu hóa của NSString ngăn chặn điều này làm việc. Nếu OP thử một loại đối tượng khác, tôi nghi ngờ mọi thứ sẽ hoạt động như mong đợi. Tôi sẽ tiếp tục tìm kiếm ... – jrturton
Cũng ở đây: http://stackoverflow.com/questions/9202810/lifetime-of-weak-local-variables-with-arc – jrturton