iOS開發(fā)之屬性標識符copy的抉擇

問題

當NSString/NSArray/NSDictionary類型時,屬性標識符你使用copy or strong?

對象接收到copy消息會觸發(fā)怎樣的動作

對象接收到copy消息互躬,如果對象的類型已經(jīng)遵守了NSCopying協(xié)議那么會觸發(fā)- (id)copyWithZone:(nullable NSZone *)zone;如果未遵守該協(xié)議那么-[User copyWithZone:]: unrecognized selector sent to instance 0x100203ed0

NSCopying協(xié)議的內(nèi)容

@protocol NSCopying
//Returns a new instance that’s a copy of the receiver.
- (id)copyWithZone:(nullable NSZone *)zone;
@end

收到copy消息的對象都會創(chuàng)建一個新的實例對象嗎根悼?

- (void)testMethod {
        #pragma mark - NSString
        NSString* k_name = [NSString stringWithFormat:@"%@",@"HZiOS"];
        NSLog(@"(1)%@---%p",k_name,k_name);
        NSString* another_name = [k_name copy];
        NSLog(@"(2)%@---%p",another_name,another_name);
        
        #pragma mark - NSMutableString
        NSMutableString* kmutable_name = [NSMutableString stringWithFormat:@"%@",@"HZiOSmutable"];
        NSLog(@"(3)%@---%p",kmutable_name,kmutable_name);
        NSString* other_name = [kmutable_name copy];
        NSLog(@"(4)%@---%p",other_name,other_name);
        /*
         (1)HZiOS---0x534f695a4855
         (2)HZiOS---0x534f695a4855
         (3)HZiOSmutable---0x100207120
         (4)HZiOSmutable---0x100700110
         */
}
NSString不可變字符串

上述代碼中NSString類型的變量在收到copy消息的時候并未返回一個全新的實例對象节预,可以看到兩個變量的內(nèi)存地址是一樣的惭适;由此可以猜想在NSString類型的變量收到copy消息時在- (id)copyWithZone:(nullable NSZone *)zone;方法中做了邏輯判斷科阎,[k_name isKindOfClass:[NSString class]]此條件成立則直接返回當前實例對象辆苔;

NSMutableString可變字符串

上述代碼中NSMutableString的變量kmutable_name收到copy消息返回了一個不可變NSString的變量other_name算灸;兩個變量的內(nèi)存地址不一致;這就說明重新創(chuàng)建一個全新的實例變量驻啤;

為什么NSString和NSMutableString接收到copy消息操作會不一樣呢乎婿?
  • NSString類型接收到copy消息如果返回一個新實例,那么內(nèi)存中就存在兩塊內(nèi)存空間存儲相同值的不可變字符串街佑,這樣做的話會浪費本來就很稀缺的內(nèi)存空間谢翎,所以具體實現(xiàn)上apple的工程師應該做一些優(yōu)化;
  • NSMutableString類型接收到消息返回一個新實例沐旨,原因在于它返回的是一個不可變對象森逮,必須是一個新的實例,如何返回內(nèi)存地址一致那么后期的操作上會引發(fā)異常磁携;

NSArray類型成員變量的修飾符屬性你使用copy or strong褒侧?

答案是使用copy;為什么使用copy這個就是為了完全避免被子類類型的變量賦值后導致的程序異常谊迄;可以試驗將下列代碼中的屬性標識符copy換成strong闷供;看一下運行的結(jié)果;

#import "HZPersonCopy.h"
@interface HZPersonCopy ()
@property(nonatomic,copy)NSArray* array;
@end
@implementation HZPersonCopy

-(void)test{
     self.array = @[@"1",@"2"];
     NSMutableArray* mutableArray =[@[@"1",@"2",@"3"] mutableCopy];
    self.array = mutableArray;
    NSLog(@"--->:%@",self.array[2]);
    [mutableArray removeLastObject];
    NSLog(@"--->:%@",self.array[2]);
 }

總結(jié):

當屬性類型為NSString统诺,并且賦值的類型也是NSString(對于不可變類型的集合同樣適用)那么使用copy和strong沒有區(qū)別歪脏,但還是建議使用copy;
-(void)testCopyStr{
        #pragma mark - copy屬性
        NSString* k_name = [NSString stringWithFormat:@"%@",@"HZiOS"];
        NSLog(@"%@---%p",k_name,k_name);
        self.name = k_name;
        NSLog(@"%@---%p",self.name,self.name);
        k_name = [NSString stringWithFormat:@"%@",@"anotherStr"];
        NSLog(@"%@---%p",k_name,k_name);
        NSLog(@"%@---%p",self.name,self.name);
        
        #pragma mark - test copy and mutableCopy
        self.name = [k_name copy];
        NSLog(@"%@---%p",self.name,self.name);
        self.name = [k_name mutableCopy];
        NSLog(@"%@---%p",self.name,self.name);
        NSLog(@"----------------------------------");
    
        /*
          HZiOS---0x534f695a4855
          HZiOS---0x534f695a4855
          anotherStr---0x10b192a02d085a5
          HZiOS---0x534f695a4855
          anotherStr---0x10b192a02d085a5
          anotherStr---0x10b192a02d085a5
         */
}

-(void)testStrongStr{
    #pragma mark - strong屬性
    NSString* k_name = [NSString stringWithFormat:@"%@",@"HZiOS1"];
    NSLog(@"%@---%p",k_name,k_name);
    self.anotherName = k_name;
    NSLog(@"%@---%p",self.anotherName,self.anotherName);
    k_name = [NSString stringWithFormat:@"%@",@"anotherStr1"];
    NSLog(@"%@---%p",k_name,k_name);
    NSLog(@"%@---%p",self.anotherName,self.anotherName);
    
   #pragma mark - test copy and mutableCopy
    self.anotherName = [k_name copy];
    NSLog(@"%@---%p",self.anotherName,self.anotherName);
    self.anotherName = [k_name mutableCopy];
    NSLog(@"%@---%p",self.anotherName,self.anotherName);
    
    /*
      HZiOS1---0x1002036a0
      HZiOS1---0x1002036a0
      HZiOS1addStr---0x1002036a0
      HZiOS1addStr---0x1002036a0
      HZiOS1addStr---0x1001029b0
      HZiOS1addStr---0x100700150
     */
}
唯一需要注意的是屬性類型為NSString時粮呢,接收到[xxx mutableCopy]的返回值婿失,使用copy和strong會略有不同钞艇;這個可以看代碼中的內(nèi)存地址;

copy屬性特征:接收到[xxx mutableCopy]的返回值豪硅,實際又接收了copy消息哩照,這樣在內(nèi)存中有存在兩塊內(nèi)存空間存儲相同的不可變字符,so優(yōu)化合并懒浮,所以打印出來的內(nèi)存地址是一樣的飘弧;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砚著,隨后出現(xiàn)的幾起案子眯牧,更是在濱河造成了極大的恐慌,老刑警劉巖赖草,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件学少,死亡現(xiàn)場離奇詭異,居然都是意外死亡秧骑,警方通過查閱死者的電腦和手機版确,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎折,“玉大人绒疗,你說我怎么就攤上這事÷畛危” “怎么了吓蘑?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坟冲。 經(jīng)常有香客問我磨镶,道長,這世上最難降的妖魔是什么健提? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任琳猫,我火速辦了婚禮,結(jié)果婚禮上私痹,老公的妹妹穿的比我還像新娘脐嫂。我一直安慰自己,他們只是感情好紊遵,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布账千。 她就那樣靜靜地躺著,像睡著了一般暗膜。 火紅的嫁衣襯著肌膚如雪匀奏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天桦山,我揣著相機與錄音攒射,去河邊找鬼醋旦。 笑死恒水,一個胖子當著我的面吹牛会放,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钉凌,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼咧最,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了御雕?” 一聲冷哼從身側(cè)響起矢沿,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酸纲,沒想到半個月后捣鲸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡闽坡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年栽惶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾嗅。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡外厂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出代承,到底是詐尸還是另有隱情汁蝶,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布论悴,位于F島的核電站掖棉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膀估。R本人自食惡果不足惜啊片,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玖像。 院中可真熱鬧紫谷,春花似錦、人聲如沸捐寥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽握恳。三九已至瞒窒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乡洼,已是汗流浹背崇裁。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工匕坯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拔稳。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓葛峻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巴比。 傳聞我的和親對象是個殘疾皇子术奖,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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