[英]iOS ARC - weak and strong properties
我試圖了解ARC的工作方式,據我所知,我應該在這里做錯事。 這是我正在使用的代碼:
接口:
@interface ViewController : UIViewController{
}
@property (strong, nonatomic) NSString * myString ;
@property (weak, nonatomic) NSString * myPointer ;
執行:
- (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) ;
}
執行此操作后,我得到:
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!
如果我沒錯,由於myPointer很弱,它不應該保留對象的內容。 所以,它應該顯示nil而不是“Hello World!”。
我究竟做錯了什么?
在Caleb的回答之后,我創建了另一個弱指針,請參閱下面的代碼:
- (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) ;
}
關鍵是我仍然得到了以前的答案:
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!
正如Caleb指出的那樣,在這個例子中使用常量NSString並不是一個好主意。
在源代碼中創建字符串對象的最簡單方法是使用Objective-C @“...”構造:
NSString * temp = @“/ tmp / scratch”; 請注意,以這種方式創建字符串常量時,應避免使用除7位ASCII字符之外的任何內容。 這樣的對象是在編譯時創建的,並且在整個程序的執行過程中都存在。 編譯器使這些對象常量在每個模塊的基礎上是唯一的,並且它們永遠不會被釋放,盡管您可以像執行任何其他對象一樣保留和釋放它們。 您還可以像執行任何其他字符串一樣將消息直接發送到字符串常量:
BOOL same = [@“comparison”isEqualToString:myString];
文檔解釋了常量字符串永遠不會消失。
嘗試使用其他東西進行實驗。 我嘗試了NSObject,它產生了預期的結果。
接口:
@interface ViewController : UIViewController
@property (strong, nonatomic) NSObject * myString;
@property (weak, nonatomic) NSObject * myPointer;
@end
執行:
@implementation ViewController
@synthesize myString = _myString;
@synthesize myPointer = _myPointer;
- (void)viewDidLoad{
[super viewDidLoad];
self.myString = [[NSObject alloc] init];
self.myPointer = self.myString;
self.myString = nil;
NSLog(@"myString: %@", self.myString);
NSLog(@"myPointer: %@", self.myPointer);
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
當沒有強大的內存指針時,弱指針被設置為nil,如文檔中所述 - Apple Developer或llvm 。
__weak指定不使引用對象保持活動狀態的引用。 當沒有對象的強引用時,弱引用設置為nil。
所以,它應該顯示nil而不是“Hello World!”。
常量字符串永遠不會被釋放,所以你的`@“Hello World!” 永遠不會消失。 這就是為什么你的弱引用永遠不會設置為nil。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.