日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Objective-c之NSCopying

發(fā)布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-c之NSCopying 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?

Objective-c之NSCopying

? ?

copy的原理:

?執(zhí)行<NSCopying>協(xié)議,類中必須實現(xiàn)copyWithZone:方法響應(yīng)的copy消息。?

?copy消息將發(fā)送copyWithZone:這個消息給你的類,它的參數(shù)是nil。

?copyWithZone:返回一個不可改變的copy

  • *MyPoint.h*/??
  • #import?<Foundation/Foundation.h>??
  • ??
  • ??
  • @interface?MyPoint?:?NSObject<NSCopying>//繼承超類??
  • {??
  • ????int?x;??
  • ????int?y;??
  • };??
  • //set方法??
  • -(void)?setMyPoint:(int)x?andY:(int)y;??
  • //get方法??
  • -(int)?getX;??
  • -(int)?getY;??
  • ??
  • @end??

  • ?

    [cpp]?view plaincopy
  • /*MyPoint.m*/??
  • #import?"MyPoint.h"??
  • ??
  • @implementation?MyPoint??
  • -(void)?setMyPoint:(int)_x?andY:(int)_y??
  • {??
  • ????//要對傳進來的x和y進行判斷??
  • ????if(_x<0)??
  • ????{??
  • ????????x?=?1;??
  • ????}??
  • ????if(_y<0)??
  • ????{??
  • ????????y?=?1;??
  • ????}??
  • ????x?=?_x;??
  • ????y?=?_y;??
  • }??
  • -(int)?getX??
  • {??
  • ????return?x;??
  • }??
  • -(int)?getY??
  • {??
  • ????return?y;??
  • }??
  • //copy??
  • /*?
  • ????zone參數(shù)處理不同的你alloc出來的內(nèi)存區(qū)域,如果你寫的應(yīng)用程序alloc了大量的內(nèi)存,并且你又想優(yōu)化你的內(nèi)存區(qū)域。?
  • ????你可以給copywithzone傳值,調(diào)用allocwithzone來alloc內(nèi)存:這個方法可以在指定的區(qū)域alloc內(nèi)存?
  • ?*/??
  • -(id)?copyWithZone:(NSZone?*)zone?//創(chuàng)建一個復制的接收器,儲存zone???
  • {??
  • ????MyPoint?*newPoint?=?[[MyPoint?allocWithZone:zone]init];??
  • ????[newPoint?setMyPoint:x?andY:y];??
  • ????return?newPoint;??
  • }??
  • /*?
  • ????NSZone?是蘋果系統(tǒng)對內(nèi)存分配和釋放的優(yōu)化方式。?
  • ????NSZone不是一個對象;它是一個C結(jié)構(gòu),用于紀錄關(guān)于內(nèi)存處理(管理)一系列對象的信息?
  • ????在這里它處理了zone這個傳進來的對象的信息??
  • */??
  • @end??

  • ?

    [cpp]?view plaincopy
  • #import?<Foundation/Foundation.h>??
  • #import?"MyPoint.h"??
  • int?main?(int?argc,?const?char?*?argv[])??
  • {??
  • ????MyPoint?*point1?=?[[MyPoint?alloc]init];//創(chuàng)建myPoint對象,alloc是分配內(nèi)存空間,init是初始化??
  • ????[point1?setMyPoint:2?andY:3];//調(diào)用對象point1的方法??
  • ????NSLog(@"x?=?%i",[point1?getX]);//[point1?getX]調(diào)用get方法??
  • ????NSLog(@"y?=?%i",[point1?getY]);??
  • ??????
  • ????MyPoint?*point2?=?[point1?copy];//實現(xiàn)復制構(gòu)造??
  • ????[point2?setMyPoint:5?andY:5];??
  • ????NSLog(@"x?=?%i",[point2?getX]);??
  • ????NSLog(@"y?=?%i",[point2?getY]);??
  • ??????
  • ????[point1?release];//?release?是釋放分配的內(nèi)存空間??
  • ????[point2?release];??
  • ????return?0;??
  • } ?
  • ios拷貝小議

    ?

    1.copy vs mutableCopy

    copy,對于不可變的對象,簡單的指向其內(nèi)存.對于可變對象,復制內(nèi)存內(nèi)容到新的內(nèi)存中并把新的內(nèi)存值賦值給左值.

    mutableCopy,始終復制到新的內(nèi)存中,以一個可變的類型賦值給左值.

    2.copy vc retain

    retain,引用計數(shù)+1,內(nèi)存地址賦值給左值.

    copy,對于不可變對象的,相當于retain;對于可變對象,則是深拷貝賦值.

    舉例:

    NSString* a = [NSString stringWithFormat:@"%@",@"this is a"];

    NSString* b = [a copy];

    NSString* bb = [a retain];

    NSString* cc = [a mutableCopy];//實際上cc應(yīng)該是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類型的,不可變.如果需要可以改變就需要自己定義屬性函數(shù).

    -(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時的正確賦值方法,因為沒有涉及到原來的內(nèi)存指針什么事

    b->stringB = @"what";

    // 看看被注釋的這個錯誤方法,由于setter方法的特性,原來的stringB指向的內(nèi)存的retainCount減一

    // 而由于NSCopyObject的特性,兩者又是指向同一個地址的,所以,原類中stirngB指向的地址已經(jīng)釋放了,之后你dealloc中在釋放一次?!.就出錯啦

    // b.stringB = @"what";

    return b;

    }

    ?

    ios拷貝小議
    2011-10-13 10:44:45 ????我來說兩句??? ???
    收藏????我要投稿

    1.copy vs mutableCopy

    copy,對于不可變的對象,簡單的指向其內(nèi)存.對于可變對象,復制內(nèi)存內(nèi)容到新的內(nèi)存中并把新的內(nèi)存值賦值給左值.

    mutableCopy,始終復制到新的內(nèi)存中,以一個可變的類型賦值給左值.

    ?

    2.copy vc retain

    retain,引用計數(shù)+1,內(nèi)存地址賦值給左值.

    copy,對于不可變對象的,相當于retain;對于可變對象,則是深拷貝賦值.

    舉例:

    ??? NSString* a = [NSString stringWithFormat:@"%@",@"this?is a"];??? NSString* b = [a copy];??? NSString* bb = [a retain];??? NSString* cc = [a mutableCopy];//實際上cc應(yīng)該是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類型的,不可變.如果需要可以改變就需要自己定義屬性函數(shù).

    -(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時的正確賦值方法,因為沒有涉及到原來的內(nèi)存指針什么事??? b->stringB = @"what";// 看看被注釋的這個錯誤方法,由于setter方法的特性,原來的stringB指向的內(nèi)存的retainCount減一// 而由于NSCopyObject的特性,兩者又是指向同一個地址的,所以,原類中stirngB指向的地址已經(jīng)釋放了,之后你dealloc中在釋放一次?!.就出錯啦//??? b.stringB = @"what";??? return b;}

    ?

  • 轉(zhuǎn)載于:https://www.cnblogs.com/iOS-mt/p/4119663.html

    總結(jié)

    以上是生活随笔為你收集整理的Objective-c之NSCopying的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。