版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.09.07 |
前言
不管ARC還是MRC都有引用計(jì)數(shù),不同的是MRC的引用計(jì)數(shù)需要程序員自己管理,而ARC(iOS5及iOS5以后)的引用計(jì)數(shù)程序會自動幫助管理引用計(jì)數(shù)。下面就研究一下引用計(jì)數(shù)相關(guān)的幾個問題。感興趣的可以看我上面寫的幾篇。
1. 引用計(jì)數(shù)相關(guān)幾個問題(一) —— alloc init 引用計(jì)數(shù)
問題提出
NSString有很多的實(shí)例化方法,那么這些方法在實(shí)例化的過程中,引用計(jì)數(shù)是如何變化的呢,下面我們就研究這個問題,同時給出測試過程與結(jié)果。
問題驗(yàn)證
測試1: [[NSString alloc] init];
- (void)demoAllocInitMethod
{
NSString *obj = [[NSString alloc] init];
NSLog(@"retainCount = %ld", obj.retainCount);
}
下面看測試結(jié)果
2017-09-07 10:54:49.974265+0800 JJOC[2516:1521721] retainCount = -1
測試2: - (instancetype)initWithFormat:(NSString )format, ...
- (void)demoAllocInitFormat
{
NSString *obj = [[NSString alloc] initWithFormat:@"%@", @"hello world"];
NSLog(@"retainCount = %ld", obj.retainCount);
[obj retain];
NSLog(@"retainCount = %ld", obj.retainCount);
[obj release];
NSLog(@"retainCount = %ld", obj.retainCount);
}
下面看測試測試結(jié)果
2017-09-07 10:58:37.129659+0800 JJOC[2522:1522579] retainCount = 1
2017-09-07 10:58:37.129715+0800 JJOC[2522:1522579] retainCount = 2
2017-09-07 10:58:37.129728+0800 JJOC[2522:1522579] retainCount = 1
測試3:- (instancetype)initWithString:(NSString )aString
- (void)demoAllocInitWithString
{
NSString *obj = [[NSString alloc] initWithString:@"hello world"];
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
[obj retain];
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
[obj release];
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
}
看輸出結(jié)果
2017-09-07 11:00:55.538982+0800 JJOC[2526:1523224] retainCount = -1
2017-09-07 11:00:55.539026+0800 JJOC[2526:1523224] retainCount = 18446744073709551615
2017-09-07 11:00:55.539039+0800 JJOC[2526:1523224] retainCount = -1
2017-09-07 11:00:55.539049+0800 JJOC[2526:1523224] retainCount = 18446744073709551615
2017-09-07 11:00:55.539059+0800 JJOC[2526:1523224] retainCount = -1
2017-09-07 11:00:55.539071+0800 JJOC[2526:1523224] retainCount = 18446744073709551615
測試4:直接賦值
- (void)demoString
{
NSString *obj = @"hello world";
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
[obj retain];
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
[obj release];
NSLog(@"retainCount = %ld", obj.retainCount);
NSLog(@"retainCount = %lu", (unsigned long)obj.retainCount);
}
下面看輸出結(jié)果
2017-09-07 11:12:19.999139+0800 JJOC[2529:1524439] retainCount = -1
2017-09-07 11:12:19.999185+0800 JJOC[2529:1524439] retainCount = 18446744073709551615
2017-09-07 11:12:19.999198+0800 JJOC[2529:1524439] retainCount = -1
2017-09-07 11:12:19.999208+0800 JJOC[2529:1524439] retainCount = 18446744073709551615
2017-09-07 11:12:19.999218+0800 JJOC[2529:1524439] retainCount = -1
2017-09-07 11:12:19.999228+0800 JJOC[2529:1524439] retainCount = 18446744073709551615
結(jié)論:從上面的幾個方法中,我們可以看到,方法- (instancetype)initWithFormat:(NSString *)format, ...
實(shí)例化會引起引用計(jì)數(shù)的變化,其他的實(shí)例化方法不會,究其原因,應(yīng)該是其他的都是實(shí)例化一個字符串常量,系統(tǒng)不會釋放,所以不用管理引用計(jì)數(shù),而format
方法中可以添加很多其他類型作為參數(shù),需要管理引用計(jì)數(shù)。
后記
未完,待續(xù)~~~