複製物件的基本概念
物件複製
複製物件顧名思義,複製乙個物件作為副本,它會開闢一塊新的記憶體(堆記憶體)來儲存副本物件,就像複製檔案一樣。即源物件和副本物件是兩塊不同的記憶體區域協議
協議 常用的可複製物件有:nsnumber
、nsstring
、nsarray
、nsdictionary等
複製物件的種類
copy:產生物件的副本是不可變的
mutablecopy:產生的物件副本是可變的
深淺拷貝的基本概念和用法
淺層複製(shallow copy)
淺拷貝該操作不會複製物件
淺拷貝後,新物件,只是指向原有物件的乙個引用
深層複製 (deep copy)
深拷貝是一種會重新分配記憶體位址的拷貝方式
利用深拷貝,將會複製產生乙個新的物件
自定義類實現深層拷貝步驟:
採用nscopying協議
實現nscopying協議
呼叫copy
方法,實現深層複製
物件的自定義拷貝
記憶體管理的原則
如果使用alloc
、copy
或者new
方法獲得乙個物件
那麼該物件的保留計數器的值為1
而且你要負責釋放該物件
copy方法
copy訊息的作用,是複製物件
通知物件,建立乙個全新的物件
並使新物件與接收copy
訊息的原來的那個物件一樣
單例設計模式
基本概念
單例設計模式運用較為普遍、廣泛且較為簡單的設計模式之一,它的設計原理是始終返回乙個例項,即乙個類始終只有乙個例項。
建立單例設計模式的基本步驟
宣告乙個單件物件的靜態例項,並初始化為nil。
建立乙個類的類工廠方法,生成乙個該類的例項,當且僅當這個類的例項為nil時
覆蓋allocwithzone
:方法,確保使用者(程式設計師)在直接分配和初始化物件時,不會產生另乙個物件。
實現nscopying
協議,覆蓋
release
、autorelease
、retain
、retaincount
方法,以此確保單例的狀態
在多執行緒的環境中,注意使用@synchronized
關鍵字,確保靜態例項被正確的建立和初始化
copy
main.m
#import #import "people.h"
int main(int argc, const char * argv)
return 0;}
people.m
#import "people.h"
@implementation people
@synthesize name=_name,age=_age;
- (id)copywithzone:(nszone *)zone
@end
people.h
#import @inte***ce people : nsobject@property(nonatomic,assign) nsstring *name;
@property(nonatomic,copy) nsstring *age;
@end
danli
main.m
#import #import "usercontext.h"
int main(int argc, const char * argv)
return 0;}
usercontext.m
#import "usercontext.h"
static usercontext *instancescontext=nil;
@implementation usercontext
//定義類方法,實現初始化
+(id)shareusercontext
}return instancescontext; }
+(id)allocwithzone:(nszone *)zone
}return instancescontext;}
//覆蓋拷貝方法
- (id)copywithzone:(nszone *)zone;
- (oneway void)release
-(id)retain
- (unsigned)retaincount
- (id)autorelease
@end
usercontext.h
#import @inte***ce usercontext : nsobject@property(nonatomic,assign) nsstring *name;
@property(nonatomic,assign) nsstring *password;
+(id)shareusercontext;
@end
物件複製與淺複製
a 15 echo a.輸出15 b a echo b.輸出15 b 25 echo b.輸出25 echo a.輸出15 可以發現,普通變數是值傳遞,在不同的記憶體空間,其中乙個改變對於另乙個沒有影響 class student public function setage age public ...
餓漢單例與懶漢單例
餓漢單例 執行緒安全 public class mon public static mon getinstance public static mon getinstance if instance null 此時還沒有例項化 instance new mon return instance pub...
c dll 單例模式出現多個單例物件
我這裡的問題主要是這樣的 有三個project,project1,project2,projecttest.project2 依賴於project1,並且在project2 中 存在project1 中乙個單例類的例項。project1 singletonclass project2 a class...