iOS中修飾詞

1.copy和mutableCopy

我們先對一個(gè)字符串做copy和mutablecopy操作,看得到的是什么

NSString *str1 = [NSString stringWithFormat:@"123"];
    NSString *str2 = @"123";
    NSMutableString *mutableS = [[NSMutableString alloc] initWithFormat:@"12"];
    NSLog(@"str1 = %@ p = %p,,str2 = %@ , p = %p,,mutableS = %@ , p = %p",[str1 class],str1,[str2 class],str2,[mutableS class],mutableS);
    NSLog(@"copefromStr = %@,,%p ,, mutableCopefromStr = %@,%p",[[str1 copy] class],[str1 copy],[[str1 mutableCopy] class],[str1 mutableCopy]);
    id mutbaleCopyFromStr = [str1 mutableCopy];
    if ([mutbaleCopyFromStr isKindOfClass:[NSMutableString class]]) {
        NSLog(@"不可變字符串mutablecopy后得到可變字符串");
    }
    NSLog(@"copefromMutableStr = %@,,%p ,, mutableCopefromMutableStr = %@,%p",[[mutableS copy] class],[mutableS copy],[[mutableS mutableCopy] class],[mutableS mutableCopy]);

對應(yīng)的輸出:


字符串拷貝后結(jié)果.png

從輸出我們可以總結(jié)為

類型 copy后類型 copy后地址是否改變 mutablecopy后類型 mutablecopy后地址是否改變
NSString NSString 不變 NSMutableString 改變
NSMutableString NSString 改變 NSMutableString 改變

我們對數(shù)組做copy和mutablecopy操作,看下結(jié)果

NSArray *array = [NSArray arrayWithObject:mutableS];
    NSLog(@"array = %@,p = %p",[array class],array);
    id copyArray = [array copy];
    id mutbaleCopyArray = [array mutableCopy];
    NSLog(@"copyfromNSArray = %@,p=%p,,mutableCopyFromNSArray = %@,p=%p",[copyArray class],copyArray,[mutbaleCopyArray class],mutbaleCopyArray);
    NSLog(@"原來對應(yīng)的值為 array = %@ ,, copyArray = %@ ,, mutbaleCopyArray = %@",array,copyArray,mutbaleCopyArray);
    //更改字符串的值,然后看下數(shù)組里面的值是否也跟著改變
//    mutableS = [NSMutableString stringWithFormat:@"+++"];
    [mutableS appendFormat:str1];
    NSLog(@"更改字符串的值之后對應(yīng)的值為 array = %@ ,, copyArray = %@ ,, mutbaleCopyArray = %@",array,copyArray,mutbaleCopyArray);
    
    NSMutableString *mStr = [NSMutableString stringWithFormat:@"--"];
    NSMutableArray *mArray = [NSMutableArray arrayWithObject:mStr];
    NSLog(@"mArray = %@,,p = %p",[mArray class],mArray);
    
    id copyMutableArray = [mArray copy];
    id mutableCopyMutableArray = [mArray mutableCopy];
    NSLog(@"原來對應(yīng)的值為 mArray = %@ ,, copyMutableArray = %@ ,, mutableCopyMutableArray = %@",mArray,copyMutableArray,mutableCopyMutableArray);
    
    [mStr appendFormat:str1];
    NSLog(@"更改字符串的值之后對應(yīng)的值為 mArray = %@ ,, copyMutableArray = %@ ,, mutableCopyMutableArray = %@",mArray,copyMutableArray,mutableCopyMutableArray);
    NSLog(@"copyfromNSMutableArray = %@,p=%p,,mutableCopyFromNSMutableArray = %@,p=%p",[copyMutableArray class],copyMutableArray,[mutableCopyMutableArray class],mutableCopyMutableArray);

對應(yīng)輸出為:


數(shù)組拷貝后的結(jié)果.png

總結(jié):

類型 copy后類型 copy后地址是否改變 mutablecopy后類型 mutablecopy后地址是否改變
NSArray NSArray 不變 NSMutableArray 改變
NSMutableArray NSArray 改變 NSMutableArray 改變

還有個(gè)問題要注意:
1.[mutableS appendFormat:str1];
對mutableS的值進(jìn)行跟改,數(shù)組中的值也會(huì)變

  1. mutableS = [NSMutableString stringWithFormat:@"+++"];
    對地址進(jìn)行跟改時(shí),數(shù)組中的值是不會(huì)改變的。

2.屬性特質(zhì)

a.原子性

nonatomic特質(zhì):不使用同步鎖。atomic同步鎖。在使用中我們都是用nonatomic。

b.讀/寫權(quán)限

readwrite:讀寫特質(zhì)。擁有獲取方法和設(shè)置方法
readonly:只讀。只有獲取方法,沒有設(shè)置方法

c.內(nèi)存管理語義

assign:在使用基本類型時(shí)會(huì)使用。如int、CGFloat等
strong:強(qiáng)引用。此特性表明該屬性定義了一種“擁有關(guān)系”,為這種屬性設(shè)置新值時(shí),設(shè)置方法會(huì)先保留新值,并釋放舊值,然后在講新值設(shè)置上去。
weak:弱引用。此特性表明該屬性定義了一種“非擁有關(guān)系”,為這種屬性設(shè)置新值時(shí),設(shè)置方法即不會(huì)保留新值,也不會(huì)釋放舊值,在所描述屬性的對象摧毀時(shí),屬性值會(huì)自動(dòng)清空。
unsafe_unretained:與assign相同,但是它適用于“對象類型”,非擁有關(guān)系,當(dāng)對象摧毀時(shí)不會(huì)自用清空。
copy:與strong類似。設(shè)置方法并不保留新值,而是拷貝。當(dāng)屬性類型為NSString類型時(shí),使用此特質(zhì)來保護(hù)封裝性,因?yàn)樗赡苤赶蛞粋€(gè)NSMutableString類型的實(shí)例,此時(shí)如設(shè)置完,可能會(huì)在對象不知道的情況下遭人修改。所以,這是就要拷貝一份不可變的字符串,確保值不會(huì)變動(dòng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,671評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,260評論 8 265
  • 前言 最先接觸編程的知識是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識,c語言,java語言,單片機(jī)的匯編語言等;大學(xué)畢...
    oceanfive閱讀 3,395評論 0 7
  • 婚姻就像是一座圍城,城外的人想進(jìn)去,而城里的人卻又想出來。 我不清楚造成這種情況的原因有哪些,但是一定有一種原因,...
    微風(fēng)知意閱讀 999評論 1 3
  • 2014年12月25日的時(shí)候,院系里組織活動(dòng),讓我們寫一封信給一年后的自己。大約十幾天前,這封被收上去的信重新回到...
    朵影閱讀 950評論 0 1

友情鏈接更多精彩內(nèi)容