引用計(jì)數(shù)相關(guān)幾個問題(二) —— NSString不同實(shí)例化方法的引用計(jì)數(shù)

版本記錄

版本號 時間
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ù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容