1. 程式人生 > >iOS copy mutableCopy詳解

iOS copy mutableCopy詳解

一、從面向物件到Objective-C概覽copy

1、面向物件:

In object-oriented programming, object copying is creating a copy of an existing object, a unit of data in object-oriented programming. The resulting object is called an object copy or simply copy of the original object. Copying is basic but has subtleties and can have significant overhead. There are several ways to copy an object, most commonly by a copy constructor or cloning. Copying is done mostly so the copy can be modified or moved, or the current value preserved. If either of these is unneeded, a reference to the original data is sufficient and more efficient, as no copying occurs.

在面向物件的程式設計中,物件的copy就是建立一個已經存在的物件的copy。這種物件的建立的結果被稱為原始物件的copy。copy是很基礎的,但是也有其精巧的地方,並且可能造成巨大的消耗。有很多種方式可以copy物件,最常用的就是copy構造器和克隆。copy經常用於物件的修改、移動和保護。如果上述的幾種應用都不需要,持有原始物件的引用就足夠了,並不需要copy。

2、OC:

In Objective-C, the methods copy and mutableCopy are inherited by all objects and intended for performing copies; the latter is for creating a mutable type of the original object. These methods in turn call the copyWithZone and mutableCopyWithZone methods, respectively, to perform the copying. An object must implement the corresponding copyWithZone method to be copyable.

在OC中,copy和mutableCopy兩個方法是被所有物件繼承的(有點小毛病,應該指所有繼承自NSObject的類),這兩個方法就是為copy準備的。其中,mutableCopy是為了建立原始物件的可變型別的copy。這兩個方法分別呼叫copyWithZone和mutableCopyWithZone兩個方法來進行copy。一個物件必須實現copyWithZone或者mutableCopyWithZone,才能進行copy或者mutableCopy。

那麼,我們可以從以上獲取到什麼資訊?

  • copy經常用於物件的修改、移動和保護。如果上述的幾種應用都不需要,持有原始物件的引用就足夠了,並不需要copy。

  • 一個類必須實現copyWithZone或者mutableCopyWithZone,才能進行copy或者mutableCopy。

下一階段,本文將展開講述OC中的copy相關資訊以及如何使用copy方法。

二、Objective-C中copy相關

1、OC中的copy相關內容

  • 在XCode 裡Foundation.framework下的Headers裡,也在系統裡找到原檔案:/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSObject.h

1 2 3 4 5 6 @protocol NSCopying - (id)copyWithZone:(nullable NSZone *)zone; @end @protocol NSMutableCopying - (id)mutableCopyWithZone:(nullable NSZone *)zone; @end
  • 在/usr/include/objc 下面找到 runtime 的 NSObject.h

1 2 - (id)copy; - (id)mutableCopy;
  • 修飾屬性的關鍵字copy

2、這裡需要注意的有以下幾點

  • 若想使用copymutableCopy,需要分別實現NSCopying協議和NSMutableCopying協議,即實現copyWithZone:mutableCopyWithZone:方法。

  • 繼承自NSObject的大部分框架類均預設實現了NSCopying,並且一些具備可變型別的類如NSString、NSArray、NSDictionary,以及它們的可變型別類NSMutableString、NSMutableArray和NSMutableDictionary也實現了NSMutableCopying。(查了大部分常用類,均實現了NSCopying,所以暫時這麼說吧,可能有人說NSNumber並沒有實現NSCopying,那你可以看一下它的父類NSValue,其實現了NSCopying)

  • 對於一些自定義類,需要自己實現NSCopying。具體方式且看下部分。

三、非容器物件的深淺copy

首先,我們談一下非容器物件的深淺copy,這些非容器物件,包含常用的NSString、NSNumber等,也包括我們自定義的一些非容器類的例項。下面分三個三面進行分析。

1、首先說說深淺copy

準則
淺copy:指標複製,不會建立一個新的物件。
深copy:內容複製,會建立一個新的物件。

此處,不進行過多的解釋,從下面的結果分析中,按例子來理解。

2、框架類的深淺copy

準則
探究框架類深copy還是淺copy,需要清楚的是該類如何實現的NSCopying和NSMutableCopy的兩個方法copyWithZone:和mutableCopyWithZone:。然而OC並不開源,並且本文這裡也不會進行原始碼的推測。
那麼,我們應該遵循怎樣一個原則呢?如下:

  • 對immutableObject,即不可變物件,執行copy,會得到不可變物件,並且是淺copy。

  • 對immutableObject,即不可變物件,執行mutableCopy,會得到可變物件,並且是深copy。

  • 對mutableObject,即可變物件,執行copy,會得到不可變物件,並且是深copy。

  • 對mutableObject,即可變物件,執行mutableCopy,會得到可變物件,並且是深copy。

程式碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // 此處以NSString為例探究框架類深淺copy // 不可變物件 NSString *str = @"1"; NSString *str1 = [str copy]; NSString *str2 = [str mutableCopy]; // 可變物件 NSMutableString *mutableStr = [NSMutableString stringWithString:@"1"]; NSMutableString *mutableStr1 = [mutableStr copy];

相關推薦

iOS copy mutableCopy

一、從面向物件到Objective-C概覽copy 1、面向物件: In object-oriented programming, object copying is creating a copy of an existing object, a u

iOS繪圖CGContextRef

單獨 tsa 我們 分享 繪制線 cloc tcl attr 舉例 轉自:http://blog.csdn.net/u014286994/article/details/51333118 /* CoreGraphics - CGContext.h */ /** Grap

iOS AppDelegate 代理(啟動,開啟App,推送,通知)

//App將要啟動 - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions{ return YES;

IOS內購

介紹 最近開發的一款APP上架被駁回了,理由是: 上架的APP是培訓類,裡面金牌視訊課程需要購買,Android端使用支付寶,微信支付。 蘋果規定 數字化內容、App功能以及服務等,需要使用內購 真實世界中的服務(如一個俱樂部的會員資格)或物品(食物、衣物等

【Android】Android開發實現帶有反彈效果,仿IOS反彈scrollview教程

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先給大家看一下我們今天這個最終實現的效果圖: 這個是ios中的反彈效果。當然我

iOS塊語法(block程式設計)

——譯自Apple Reference Library《Blocks Programming Topic》 簡介 塊物件是C語言的句法和執行時特性。它類似於標準C函式,但可以將程式碼、變數繫結到堆(heap)、棧(stack)。一個塊還維護了一系列的狀態,這些狀態或資料

IOS UIScrollView——用法

UIScrollView是用來在螢幕上顯示那些在有限區域內放不下的內容。例如,在手機螢幕上顯示內容豐富的網頁或者很大的圖片。在這種情況下,需要使用者對螢幕內容進行拖動或縮放來檢視螢幕或視窗區域外的內容。 所以,ScrollView應該首先有一個視窗,用來顯示內容,其次,還要

iOS開發-Runtime

簡介 Runtime 又叫執行時,是一套底層的 C 語言 API,其為 iOS 內部的核心之一,我們平時編寫的 OC 程式碼,底層都是基於它來實現的。比如: [receiver message]; // 底層執行時會被編譯器轉化為: objc_msgSend(recei

IOS NSString 用法

//NSString 操作均不改變自身值 //構建字串 NSString *szTmp = @"A string"; //直接賦值 szTmp = nil; int n = 5; NSString *szMyString = [NSStr

【Python】numpy 中的 copy 問題

這篇文章本是我在 segmentfault 上的一個回答,但是越來越覺得有必要單獨拿出來,畢竟這個問題挺常見的。具體可參看 numpy 官方文件 。 正文 numpy關於copy有三種情況,完全不復制

iOS UITabBar屬性 UITabBarController 底部 UITabBarItem 間距調整

http://www.2cto.com/kf/201505/402189.html iOS UI Tab開發(iOS 8) tab這種樣式,類似於單選,可以叫radio-style,這是一個現在主流的layout-design,它讓APP內容結構清晰,開發分工邏輯明確

iOS開發-底層篇-Classios底層-class

前言:iOS的開發語言objective-c,它的真實面目是它不是真正的面嚮物件語言,而抽象理解為此而已。其實它就是C+,有個公式可以很好地詮釋那就是 OC = C + Runtime; 接下來我們就好好講講在Runtime下的objc-class。準備資料,objc

iOS AttributeString 使用

http://blog.csdn.net/hello_hwc/article/details/46731991 一個簡單的例子 繪製不同顏色不同字型的一個AttributeString,如圖 這裡寫圖片描述 程式碼 UILabel * Label = [[UIL

iOS學習--UIView~~~~~

不管你是使用系統的檢視還是建立自己的檢視,你需要理解UIView和UIWindow類所提供的基本結構。這些類提供了複雜的方法來管理檢視的佈局和展示。理解這些方法的工作非常重要,使你在應用發生改變時可以確認檢視有合適的行為。  檢視架構 fundamentals  大部分你想要視覺化操作都是由檢視物件-

IOS ----UIButton用法

這段程式碼動態的建立了一個UIButton,並且把相關常用的屬性都列舉了.希望對大家有用.   //這裡建立一個圓角矩形的按鈕UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];// 能夠定義的button型別有以下6種

iOS ReactiveCocoa 使用(四)

ReactiveCocoa常見類學習框架首要之處:個人認為先要搞清楚框架中常用的類,在RAC中最核心的類RACSiganl,搞定這個類就能用ReactiveCocoa開發了。1、RACSiganl:訊號類,一般表示將來有資料傳遞,只要有資料改變,訊號內部接收到資料,就會馬上發出資料。注意:訊號類(RACSig

[iOS進階]iOS快取機制

1、為什麼需要快取 應用需要離線工作的主要原因就是改善應用所表現出的效能。將應用內容快取起來就可以支援離線。我們可以用兩種不同的快取來使應用離線工作。 第一種是按需快取,這種情況下應用快取起請求應答,就和Web瀏覽器的工作原理一樣;第二種是預快

IOS面試題(一)

這套題目來自cocoachina的版主大大招人時候的題目,論壇各路大神都覺得偏難。自己看了一下,發現很多是自己知道,但又說不上來的感覺。所以覺得有必要梳理完善一下,題很多,反正寫到哪算哪吧!另外,因為我不是C/C++ 或寫 mac “發家” 所以還是有解答不上來的,但是關

iOS推送(二)收到通知跳到指定頁面的處理辦法

接著上一篇繼續,當接到通知需要的操作 一、APP在前臺        實現效果,在前臺無論在那個頁面都在頂部展示一個橫條,顯示推送資訊,點選時跳到自己處理的頁面(10秒不點選自動移除這個橫條view)        直接上程式碼吧,講解一下思路,有問題留言        當

iOS swift運算子

Swift支援C標準庫中的大多數運算子並提升了各自的相容性,從而可以排除常見的編碼錯誤。賦值操作符 (=)不會返回一個值,這樣可以防止你因粗心將賦值運算子 (=)寫成 (==)而引起錯誤。算術符(+、 -、 *、 /、 % 等)會檢查與駁回值溢位,這樣可以避免值型別的資料在超過值型別所允許的儲存範圍時