NSString copy or strong?

結(jié)論

  • 對于copy修飾的屬性來說,若賦值源是NSString、NSArray互纯、NSURLRequest三者其中之一晒杈,復(fù)制時是shallow copy(淺復(fù)制)系馆,即地址相同,類型相同。
  • 一般情況下,NSString使用copy修飾基显。即:
@property (nonatomic, copy) NSString *string;

解釋說明

結(jié)論1

首先,需要知道

copy和strong對應(yīng)的所有權(quán)修飾符都是 __strong善炫。
strong修飾的屬性撩幽,賦值后,地址相同箩艺,類型相同窜醉。
copy修飾的屬性,賦值時舅桩,通過 NSCopying 接口的 copyWithZone: 方法復(fù)制賦值源所生成的對象酱虎,賦值后,地址不一定相同擂涛,類型不一定相同。

而復(fù)制分為shallow copy與deep copy聊记,區(qū)別如下:

shallow copy 即淺復(fù)制撒妈,沒有產(chǎn)生新對象,指針指向原來對象排监。
deep copy 即深復(fù)制狰右,產(chǎn)生新對象。

接著舆床,Show the code

String相關(guān)屬性

@property (nonatomic, strong) NSString *strongString;               /**<strong string*/
@property (nonatomic, strong) NSMutableString *mStrongString;       /**<strong mutable string*/
@property (nonatomic, copy) NSString *cString;                      /**<copy string*/
@property (nonatomic, copy) NSMutableString *mCopyString;           /**<copy mutable string*/

對String的測試

- (void)stringTest {
    //來源是NSString
    NSString *string = @"string";
    NSLog(@"address: %p | class: %@ of string",string,[string class]);
    self.strongString = string;
    self.cString = string;
    self.mStrongString = string;
    self.mCopyString = string;
    [self printStringInfo];

    NSLog(@"\n");

    //來源是NSMutableString
    NSMutableString *mutableString = [NSMutableString stringWithString:@"mutable string"];
    NSLog(@"address: %p | class: %@ of mutable string",mutableString,[mutableString class]);
    self.strongString = mutableString;
    self.cString = mutableString;
    self.mStrongString = mutableString;
    self.mCopyString = mutableString;
    [self printStringInfo];
}

- (void)printStringInfo {
    NSLog(@"address: %p | class: %@ of strong string",self.strongString,[self.strongString class]);
    NSLog(@"address: %p | class: %@ of copy string",self.cString,[self.cString class]);
    NSLog(@"address: %p | class: %@ of strong mutable string",self.mStrongString,[self.mStrongString class]);
    NSLog(@"address: %p | class: %@ of copy mutable string",self.mCopyString,[self.mCopyString class]);
}

(注:以上是只有部分代碼棋蚌,想了解更多嫁佳,請查看文章底部的源代碼)

然后,分別打印來源是NSString谷暮、NSArray蒿往、NSURLRequest的運(yùn)行結(jié)果:

來源是NSString
來源是NSArray

來源是NSURLRequest

對比以上3張圖中的地址及類型,可知:
來源是NSString湿弦、NSArray瓤漏、NSURLRequest三者之一的,使用strong或copy修飾的颊埃,賦值結(jié)果都是一樣的蔬充,可證明結(jié)論1:
對于copy修飾的屬性來說,若賦值源是NSString班利、NSArray饥漫、NSURLRequest三者其中之一,復(fù)制時是shadow copy(淺復(fù)制)罗标,即地址相同庸队,類型相同。

結(jié)論2

分別打印來源是NSMutableString馒稍、NSMutableArray皿哨、NSMutableNSURLRequest的結(jié)果:


來源是NSMutableString
來源是NSMutableArray
來源是NSMutableNSURLRequest

對比以上3張圖中的地址及類型,可知:
來源若是NSMutableString纽谒,NSMutableArray证膨,NSMutableURLRequest之一

  • 使用strong修飾的,賦值后鼓黔,地址相同央勒,類型也相同。
  • 使用copy修飾的澳化,會復(fù)制賦值源所生成的對象崔步,復(fù)制后,地址不同缎谷,而來源是NSMutableArray的井濒,甚至連類型也不同(__NSArrayI__NSArrayM),說明復(fù)制時都是deep copy(深復(fù)制)列林。

(據(jù)了解瑞你,copy除了復(fù)制NSString、NSArray希痴、NSURLRequest外者甲,其他都是deep copy。)(未知真實性)

也就是說:
如果來源是NSString砌创,使用copy或strong沒有區(qū)別虏缸。
如果來源是NSMutableString鲫懒,NSString對象會因其改變而改變。若使用copy刽辙,因為是深復(fù)制窥岩,產(chǎn)生了一個新的對象,就可以避免以上情況扫倡。

而一般使用NSString變量時谦秧,并不希望它可變,Objective-C的類型確定又是在運(yùn)行時才決定的撵溃,那么賦值時疚鲤,很可能會搞錯賦值源的類型:NSMutableString誤當(dāng)作NSString,這樣也許會帶來不可預(yù)知的問題缘挑,而且此類問題一般不易察覺集歇,所以可說明結(jié)論2:
一般情況下,NSString使用copy修飾语淘。
當(dāng)然诲宇,具體情況,具體分析惶翻,使用strong也無可厚非姑蓝。

附錄:剩余的主要代碼

Array相關(guān)屬性

@property (nonatomic, strong) NSArray *strongArray;                 /**<strong array*/
@property (nonatomic, strong) NSMutableArray *mStrongArray;         /**<strong mutable array*/
@property (nonatomic, copy) NSArray *cArray;                        /**<copy array*/
@property (nonatomic, copy) NSMutableArray *mCopyArray;             /**<copy mutable array*/

URL Request相關(guān)屬性

@property (nonatomic, strong) NSURLRequest *strongRequest;          /**<strong request*/
@property (nonatomic, strong) NSMutableURLRequest *mStrongRequest;  /**<strong mutalbe request*/
@property (nonatomic, copy) NSURLRequest *cRequest;                 /**<copy request*/
@property (nonatomic, copy) NSMutableURLRequest *mCopyRequest;      /**<copy mutable request*/

對Array的測試

- (void)arrayTest {
    //來源是NSArray
    NSArray *array = @[ @"item1",@"item2"];
    NSLog(@"address: %p | class: %@ of array",array,[array class]);
    self.strongArray = array;
    self.cArray = array;
    self.mStrongArray = array;
    self.mCopyArray = array;
    [self printArrayInfo];
    
    NSLog(@"\n");
    
    //來源是NSMutableArray
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
    NSLog(@"address: %p | class: %@ of mutable array",mutableArray,[mutableArray class]);
    self.strongArray = mutableArray;
    self.cArray = mutableArray;
    self.mStrongArray = mutableArray;
    self.mCopyArray = mutableArray;
    [self printArrayInfo];
}

- (void)printArrayInfo {
    NSLog(@"address: %p | class: %@ of strong array",self.strongArray,[self.strongArray class]);
    NSLog(@"address: %p | class: %@ of copy array",self.cArray,[self.cArray class]);
    NSLog(@"address: %p | class: %@ of strong mutable array",self.mStrongArray,[self.mStrongArray class]);
    NSLog(@"address: %p | class: %@ of copy mutable array",self.mCopyArray,[self.mCopyArray class]);
}

對URL Request的測試

- (void)urlRequestTest {
    //來源是NSURLRequest
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    
    NSLog(@"address: %p | class: %@ of url request",urlRequest,[urlRequest class]);
    self.strongRequest = urlRequest;
    self.cRequest = urlRequest;
    self.mStrongRequest = urlRequest;
    self.mCopyRequest = urlRequest;
    [self printRequestInfo];
    
    NSLog(@"\n");
    
    //來源是NSMutableURLRequest
    NSMutableURLRequest *mutableURLRequest = [NSMutableURLRequest requestWithURL:url];
    NSLog(@"address: %p | class: %@ of mutable request",mutableURLRequest,[mutableURLRequest class]);
    self.strongRequest = mutableURLRequest;
    self.cRequest = mutableURLRequest;
    self.mStrongRequest = mutableURLRequest;
    self.mCopyRequest = mutableURLRequest;
    [self printRequestInfo];
}

- (void)printRequestInfo {
    NSLog(@"address: %p | class: %@ of strong request",self.strongRequest,[self.strongRequest class]);
    NSLog(@"address: %p | class: %@ of copy request",self.cRequest,[self.cRequest class]);
    NSLog(@"address: %p | class: %@ of strong mutable equest",self.mStrongRequest,[self.mStrongRequest class]);
    NSLog(@"address: %p | class: %@ of copy mutable request",self.mCopyRequest,[self.mCopyRequest class]);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吕粗,隨后出現(xiàn)的幾起案子纺荧,更是在濱河造成了極大的恐慌,老刑警劉巖颅筋,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙暇,死亡現(xiàn)場離奇詭異,居然都是意外死亡议泵,警方通過查閱死者的電腦和手機(jī)占贫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先口,“玉大人型奥,你說我怎么就攤上這事〉锞” “怎么了桩引?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長收夸。 經(jīng)常有香客問我,道長血崭,這世上最難降的妖魔是什么卧惜? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任厘灼,我火速辦了婚禮,結(jié)果婚禮上咽瓷,老公的妹妹穿的比我還像新娘设凹。我一直安慰自己,他們只是感情好茅姜,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布闪朱。 她就那樣靜靜地躺著,像睡著了一般钻洒。 火紅的嫁衣襯著肌膚如雪奋姿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天素标,我揣著相機(jī)與錄音称诗,去河邊找鬼。 笑死头遭,一個胖子當(dāng)著我的面吹牛寓免,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播计维,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袜香,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲫惶?” 一聲冷哼從身側(cè)響起蜈首,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剑按,沒想到半個月后疾就,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡艺蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年猬腰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜敢。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡姑荷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缩擂,到底是詐尸還是另有隱情鼠冕,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布胯盯,位于F島的核電站懈费,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏博脑。R本人自食惡果不足惜憎乙,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一票罐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泞边,春花似錦该押、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梢什,卻和暖如春奠蹬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绳矩。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工罩润, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翼馆。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓割以,卻偏偏與公主長得像,于是被迫代替她去往敵國和親应媚。 傳聞我的和親對象是個殘疾皇子严沥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 876評論 0 2
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,146評論 30 470
  • NSString 和 NSArray 在@property的時候,到底是用strong還是用copy修飾中姜,這里依據(jù)...
    林大鵬閱讀 3,310評論 5 7
  • 6月29號放的暑假消玄,這一天,我恐怕是做了我這20年來最糟糕的一件事丢胚◆婀希回家,臉色蠟黃携龟,爸媽看到了尤為心疼兔跌,這暑假便沒...
    音情閱讀 185評論 0 0
  • 《野馬》––繆瑩 有人說 我是脫韁的野馬 冷漠、無情 又孤傲的不可一世 可是啊 如果那個人是你 我則愿意 放下所有...
    一個喜歡深夜讀書的女子閱讀 1,174評論 6 17