如果嘗試使用自定義類(例如,人類(person類)、位址簿類(mybook類)、分數類(fraction類))中的copy方法,如
[cpp]view plain
copy
mybook = [mybook mutablecopy];
person = [person copy];
等類似的操作,將會收到一條異常出錯的訊息,它可能如下所示:
-[fraction copywithzone:]: unrecognized selector sent to instance 0x7fabb8414380
這種錯誤,是對於自定義類,要實現使用自己的類進行複製,必須根據協議實現其中的一兩個方法。
下面將展示如何為自定義的分數類(fraction類)新增copy方法。注意:這裡描述的複製策略的技巧非常適合於你自己定義的類。如果這些類是任何foundation類的子類,那麼可能需要實現較為複雜的複製策略。必須考慮這樣乙個事實:超類可能已經實現了它自己的複製策略。
實現協議時,類必須實現copywithzone:方法來響應copy訊息。(這條copy訊息僅將一條帶有nil引數的copywithzone:訊息傳送給你的類)。注意,如果想要區分可變副本和不可變副本,那麼copywithzone:應該返回不可變副本,而mutablecopywithzone:應該返回可變副本。產生物件的可變副本並不要求被複製的物件本身也是可變的(反之亦然),想要產生不可變副本的可變副本是很合理的(例如,字串物件)。
在fraction.h檔案中如下所示:(其中fraction是nsobject的子類,並且符合nscopying協議)
[cpp]view plain
copy
#import
@inte***ce fraction : nsobject
@property int
a, b;
-(void
)setto:(
int) a over: (
int) b;
-(void
)print;
@end
在實現檔案fraction.m中,為新方法新增如下定義:
[cpp]view plain
copy
#import "fraction.h"
@implementation fraction
@synthesize a,b;
-(void
)setto:(
int) aa over: (
int) bb
-(void
//實現nscopying協議的方法,來使此類具有copy功能
-(id)copywithzone:(nszone *)zone
@end
在檔案main.m中對於上述類的測試**如下:
[cpp]view plain
copy
#import
#import "fraction.h"
intmain(
intargc,
const
char
* argv)
return
0;
}
由此可以實現對自定義類fraction類的拷貝,執行結果如下:
2/5
1/3
該程式建立了乙個名為f1的fraction物件並將其設定為2/5.然後,它呼叫copy方法來產生副本,copy方法向你的物件傳送copywithzone:訊息,這個方法產生了乙個新的fraction,將f1的值複製到其中,並返回結果。回到main函式中,再將這個結果賦值給f2.隨即,將f2中的值設定為分數1/3,這樣就驗證了這些操作對原始分數f1是沒有影響的。
如果你的類可以產生子類,那麼copywithzone:方法將被繼承。在這種情況下,該方法中的程式行:
[cpp]view plain
copy
//無子類是可以這樣實現
fraction *newfract = [[fraction allocwithzone:zone] init];
應該改為:
[cpp]view plain
copy
//有子類時,需要這樣實現
fraction *newfract = [[[self class
] allocwithzone:zone] init];
這樣,可以從該類分配乙個新的物件,而這個類的copy的接收著(例如,如果它產生了乙個名為newfraction 的子類,那麼應該確保在繼承的方法中分配了新的newfraction物件,而不是fraction物件)。
如果編寫乙個類的copywithzone:方法,而該類的超類也實現了協議,那麼應該先呼叫超類的copy方法以複製繼承來的例項變數,然後加入自己的**以複製想要新增到該類中的任何附加的例項變數(如果有的話)。
你必須確定是否在類中實現淺複製或深複製,並為其編寫文件,以告知類的其他使用者。
vector中存放自定義類 ,對類的要求
vector中存放自定義類的前提是 自定義的類必須有預設建構函式。因為vector 會呼叫預設建構函式來初始化元素的物件。那必須要明確 編譯器什麼時候隱式宣告預設建構函式?有兩個條件 該類沒有顯式宣告任何建構函式。既然你都定義了,系統就不給你生成了。資料成員中沒有const 和reference。因...
object c中類的定義
一般來說乙個類的標頭檔案宣告的結構是這樣的 inte ce 類名 屬性宣告 方法宣告 end 欄位是私有的,在類外部不能使用。必須使用屬性,外部才能使用。什麼是屬性?其實屬性就是對乙個欄位的get和set方法。一般來說,給基本型別比如nsinteger的屬性新增的說明有nonatomic,assig...
實現java中自定義類載入器
前言 由於類的載入是採用委託模式,及先是父類載入器去載入載入失敗才是子類 要實現乙個類載入器不是複寫loadclass而是複寫findclass 原始碼主要邏輯就幾句 注意 這個findclass呼叫的原始碼 protected class loadclass string name,boolean...