Tôi đang cố gắng hiểu cách ARC hoạt động, và theo như tôi biết, tôi nên làm điều gì sai ở đây. Đây là mã Tôi đang sử dụng:iOS ARC - thuộc tính yếu và mạnh
Interface:
@interface ViewController : UIViewController{
}
@property (strong, nonatomic) NSString * myString ;
@property (weak, nonatomic) NSString * myPointer ;
Thực hiện:
- (void)viewDidLoad{
[super viewDidLoad];
self.myString = @"Hello world!" ; // myString is strong
self.myPointer = self.myString ; // myPointer var is weak
[self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];
[self performSelector:@selector(printValues) withObject:nil afterDelay:2];
}
- (void) makeNilMyValue{
self.myString = nil ;
}
- (void) printValues{
NSLog(@"myString: %@", self.myString) ;
NSLog(@"myPointer: %@", self.myPointer) ;
}
Sau khi thực hiện điều này, tôi nhận được:
2012-02-26 11:40:41.652 test1[933:207] myString: (null)
2012-02-26 11:40:41.653 test1[933:207] myPointer: Hello world!
Nếu Tôi không sai, do myPointer là yếu, nó không nên giữ lại nội dung của đối tượng. Vì vậy, nó sẽ hiển thị nil thay vì "Hello World!".
Tôi đang làm gì sai?
Sau câu trả lời Caleb, tôi đã tạo ra một con trỏ yếu, xem mã bên dưới:
- (void)viewDidLoad{
[super viewDidLoad];
self.myString = @"Hello world!" ; // myString is strong
self.myPointer = self.myString ; // myPointer var is weak
self.myPointer2 = self.myString ; // myPointer2 var is weak
[self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];
[self performSelector:@selector(printValues) withObject:nil afterDelay:2];
}
- (void) makeNilMyValue{
self.myPointer2 = @"value changed!" ;
self.myString = nil ;
}
- (void) printValues{
NSLog(@"myString: %@", self.myString) ;
NSLog(@"myPointer: %@", self.myPointer) ;
}
Vấn đề là tôi vẫn có câu trả lời giống như tôi đã từng có:
2012-02-26 12:08:13.426 test1[1333:207] myString: (null)
2012-02-26 12:08:13.427 test1[1333:207] myPointer: Hello world!
Câu trả lời sáng chói, cảm ơn rất nhiều. – RGML