在OC中如果不注意指針內(nèi)存塊的問題代承,你可能會遇到一些很奇怪的問題汁蝶,但是卻很難解決,本文將解釋一些在OC中你可能需要了解的知識點(diǎn)论悴。
我們來看這段代碼:
NSMutableString *str = [@"string1" mutableCopy];
NSMutableString *str2 = str;
[str appendString:@"__str"];
[str appendString:@"__str2"];
NSLog(@"str1:%@ str2:%@",str,str2);
//輸出:str1:string1__str__str2 str2:string1__str__str2
我們可以看到str1和str2已經(jīng)是相同的掖棉,因?yàn)?/p>
NSMutableString *str2 = str;
這段代碼讓str2指向了str1的內(nèi)存塊,也就是說str1和str2現(xiàn)在是對同一塊內(nèi)存的兩個(gè)指向膀估,你可以說他們是一模一樣的幔亥,我們來驗(yàn)證這一點(diǎn):
NSLog(@"str1:%X str2:%X",str,str2);
//輸出:str1:B3D96B60 str2:B3D96B60
我們打印了str和str2的內(nèi)存塊,我們發(fā)現(xiàn)的確是一模一樣的察纯。
但很多時(shí)候我們希望得到的是一個(gè)新的對象紫谷,那么這個(gè)時(shí)候我們可以使用“copy,mutableCopy”語法捐寥,copy得到一個(gè)不可變變量笤昨,mutableCopy得到一個(gè)可變變量。
像這樣:
NSMutableString *str = [@"string1" mutableCopy];
NSMutableString *str2 = [str mutableCopy];
[str appendString:@"__str"];
[str appendString:@"__str2"];
NSLog(@"str1:%X str2:%X",str,str2);
//輸出:str1:92F36240 str2:92F36A90
我們用str copy出一個(gè)新的對象握恳,然后打印了他們的地址瞒窒,發(fā)現(xiàn)的確是新的一個(gè)內(nèi)存塊了。
在這里我們需要注意乡洼,所有的字面量語法都是開辟出一個(gè)新的內(nèi)存塊崇裁,包括@"",@[],@{}。
也就是說:
@"" 與[[NSString alloc]init];等價(jià)
@[] 與[[NSArray alloc]init];等價(jià)
@{} 與[[NSDictionary alloc]init];等價(jià)
[@"" mutableCopy]; 與[[NSMutableString alloc] init];等價(jià)
[@[] mutableCopy]; 與[[NSMutableArray alloc] init];等價(jià)
[@{} mutableCopy]; 與[[NSMutableDictionary alloc] init];等價(jià)
也就是說當(dāng)我們用字面量語法對一個(gè)變量賦值時(shí)相當(dāng)于對他重新開辟了內(nèi)存塊束昵,也就是原本的內(nèi)存塊和他是已經(jīng)沒有關(guān)系了拔稳。
在這里順便提一下const修飾符;
extern NSString * const var;
extern NSString const * var;
這是兩種不一樣的寫法,結(jié)果肯定也是不一樣的锹雏,區(qū)別也是在于內(nèi)存塊和指針巴比。
const修飾符將其后的變量設(shè)置為常量。
extern NSString * const var;
當(dāng)const在星號后時(shí)礁遵,var變量的內(nèi)存指針將不能指向其他內(nèi)存轻绞,同時(shí)內(nèi)存塊中的內(nèi)容也將保持不變。
extern NSString const * var;
而當(dāng)const在星號前面時(shí)佣耐,情況就發(fā)生變化了政勃,var變量的內(nèi)存指針同樣無法指向其他內(nèi)存塊,但是在這種情況下兼砖,var的內(nèi)存塊的內(nèi)存是可以發(fā)生變化的奸远。
也就是說下面這種操作是允許的:
NSMutableString const * var = [@"str" mutableCopy];
[var appendString:@"__var"];
NSLog(@"var:%@",var);
//輸出:var:str__var
而反過來則是不允許的既棺,關(guān)于這部分內(nèi)容,在本人另一篇文章中有詳細(xì)的解釋:
http://www.strongx.cn/?p=118
更多文章請關(guān)注:http://www.StrongX.cn