Objective-c之NSCopying
Objective-c之NSCopying
? ?copy的原理:
?執行<NSCopying>協議,類中必須實現copyWithZone:方法響應的copy消息。?
?copy消息將發送copyWithZone:這個消息給你的類,它的參數是nil。
?copyWithZone:返回一個不可改變的copy
?
?
ios拷貝小議
?1.copy vs mutableCopy
copy,對于不可變的對象,簡單的指向其內存.對于可變對象,復制內存內容到新的內存中并把新的內存值賦值給左值.
mutableCopy,始終復制到新的內存中,以一個可變的類型賦值給左值.
2.copy vc retain
retain,引用計數+1,內存地址賦值給左值.
copy,對于不可變對象的,相當于retain;對于可變對象,則是深拷貝賦值.
舉例:
NSString* a = [NSString stringWithFormat:@"%@",@"this is a"];NSString* b = [a copy];
NSString* bb = [a retain];
NSString* cc = [a mutableCopy];//實際上cc應該是NSMutableString類型
NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);
//輸出3,3,3,1 NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];
NSString* b = [a copy];//不可變的b
NSString* bb = [a retain];//實際類型是NSMutableString的bb
NSString* cc = [a mutableCopy];//同上
NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);
//輸出2,1,2,1
?
3.一些問題
通過上面2點,思考下面的問題
我們通常如果這樣定義一個變量
@property(nonatomic,copy) NSMutableString* mString;然后這樣使用
@synthesize mString;NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];
self.mString = a;
[mString insertString:@"m-" atIndex:0];
?
能通過么?當然不能,賦值后的mString是NSString類型的,不可變.如果需要可以改變就需要自己定義屬性函數.
-(void)setMString:(NSMutableString *)m{
mString = [m mutableCopy];
}
-(NSMutableString *)mString
{
return mString;
}
(當然,NSMutableString不是線程安全的,一般都建議私有之:@private;或者一定要用的話以NSString作為對外接口類型)
4.NSCopying NSMutableCopying NSCopyObjective()
NSCopying就是復制一個對象
NSMutableCopying就是深拷貝一個對象,讓兩個對象的改變互不影響
(其實上面著兩個完全看你怎么寫啦)
NSCopyObject(self,0,zone)就是簡單的賦值=
(在涉及到ns對象的時候,NSCopyObject不建議使用)
注意看下面一個例子:
@interface ClassB : NSObject <NSCopying>{NSString* stringB;
}
@property(nonatomic,copy) NSString* stringB;
@end -(id)copyWithZone:(NSZone *)zone
{
ClassB *b = NSCopyObject(self, 0, zone);
// 使用NSCopyObject時的正確賦值方法,因為沒有涉及到原來的內存指針什么事
b->stringB = @"what";
// 看看被注釋的這個錯誤方法,由于setter方法的特性,原來的stringB指向的內存的retainCount減一
// 而由于NSCopyObject的特性,兩者又是指向同一個地址的,所以,原類中stirngB指向的地址已經釋放了,之后你dealloc中在釋放一次?!.就出錯啦
// b.stringB = @"what";
return b;
}
?
1.copy vs mutableCopy
copy,對于不可變的對象,簡單的指向其內存.對于可變對象,復制內存內容到新的內存中并把新的內存值賦值給左值.
mutableCopy,始終復制到新的內存中,以一個可變的類型賦值給左值.
?
2.copy vc retain
retain,引用計數+1,內存地址賦值給左值.
copy,對于不可變對象的,相當于retain;對于可變對象,則是深拷貝賦值.
舉例:
??? NSString* a = [NSString stringWithFormat:@"%@",@"this?is a"];??? NSString* b = [a copy];??? NSString* bb = [a retain];??? NSString* cc = [a mutableCopy];//實際上cc應該是NSMutableString類型??? NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);//輸出3,3,3,1??? NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this?is a"];??? NSString* b = [a copy];//不可變的b??? NSString* bb = [a retain];//實際類型是NSMutableString的bb??? NSString* cc = [a mutableCopy];//同上??? NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);//輸出2,1,2,1
3.一些問題
通過上面2點,思考下面的問題
我們通常如果這樣定義一個變量
@property(nonatomic,copy)? NSMutableString* mString;然后這樣使用
@synthesize mString;NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this?is a"];self.mString = a;[mString insertString:@"m-" atIndex:0];
能通過么?當然不能,賦值后的mString是NSString類型的,不可變.如果需要可以改變就需要自己定義屬性函數.
-(void)setMString:(NSMutableString *)m{??? mString = [m mutableCopy];}-(NSMutableString *)mString{??? return mString;}(當然,NSMutableString不是線程安全的,一般都建議私有之:@private;或者一定要用的話以NSString作為對外接口類型)
4.NSCopying NSMutableCopying NSCopyObjective()
NSCopying就是復制一個對象
NSMutableCopying就是深拷貝一個對象,讓兩個對象的改變互不影響
(其實上面著兩個完全看你怎么寫啦)
NSCopyObject(self,0,zone)就是簡單的賦值=
(在涉及到ns對象的時候,NSCopyObject不建議使用)
注意看下面一個例子:
@interface ClassB : NSObject <NSCopying>{??? NSString* stringB;}@property(nonatomic,copy) NSString* stringB;@end-(id)copyWithZone:(NSZone *)zone{??? ClassB *b = NSCopyObject(self, 0, zone);// 使用NSCopyObject時的正確賦值方法,因為沒有涉及到原來的內存指針什么事??? b->stringB = @"what";// 看看被注釋的這個錯誤方法,由于setter方法的特性,原來的stringB指向的內存的retainCount減一// 而由于NSCopyObject的特性,兩者又是指向同一個地址的,所以,原類中stirngB指向的地址已經釋放了,之后你dealloc中在釋放一次?!.就出錯啦//??? b.stringB = @"what";??? return b;}
?
轉載于:https://www.cnblogs.com/iOS-mt/p/4119663.html
總結
以上是生活随笔為你收集整理的Objective-c之NSCopying的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言笔记初级篇】第一章:C语言快速入
- 下一篇: (软件工程复习核心重点)第九章软件项目管