A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. #import <Foundation/Foundation.h>   


  2. // 需要用到copy方法的自定义类,需要遵守NSCopying协议,
  3. // 并实现-(id)copyWithZone:(NSZone *)zone 方法
  4. @interface User :NSObject<NSCopying>
  5. {
  6.         NSString *_name;
  7. }
  8. + (id)userWithName:(NSString *)name;
  9. - (void)setName:(NSString *)name;
  10. @end
  11. int main(int argc, const char * argv[])  
  12. {        
  13.         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  14.        
  15.        
  16.         NSString * str= @"who";
  17.         // copy产生inmutable对象,若源对象也是inmutable,则返回同一对象
  18.         NSString * str2=[str copy];
  19.         // mutableCopy都会产生一个新对象,并且是mutable
  20.         NSMutableString * mstr=[str mutableCopy];
  21.         // 源对象为mutable的copy,产生新的inmutable对象
  22.         NSString *str4=[mstr copy];
  23.         NSLog(@"\nstr=%p\nstr2=%p\nmstr=%p\nstr4=%p",str,str2,mstr,str4);
  24.        
  25.        
  26.         User *user1=[User userWithName:mstr];
  27.         [mstr appendString:@" are you"];
  28.         NSLog(@"\nuser1=%@\nmstr=%@",user1,mstr);
  29.    
  30.    // copy后产生新的autorelease过的对象
  31.    User *user2 =[user1 copy];
  32.    [user2 setName:mstr];
  33.    NSLog(@"\nuser1=%@\nuser2=%@",user1,user2);
  34.     [pool drain];
  35.      return 0;  
  36. }

  37. @implementation User

  38. + (id)userWithName:(NSString *)name
  39. {
  40.         id u=[[self alloc] init];
  41.         [u setName:name];
  42.         return [u autorelease];
  43. }

  44. - (id)copyWithZone:(NSZone *)zone
  45. {
  46.         return [User userWithName:self->_name];
  47. }

  48. - (void)setName:(NSString *)name
  49. {
  50.         if(name!=_name)
  51.         {
  52.                 [_name release];
  53.                 _name=[name copy];
  54.         }
  55. }
  56. - (void)dealloc
  57. {
  58.         NSLog(@"%@ %@ deallocated",[self className],_name);
  59.         [_name release];
  60.         [super dealloc];
  61. }

  62. - (NSString *)description
  63. {
  64.         return [NSString stringWithFormat:@"name is %@",_name];
  65. }
  66. @end
复制代码



copy:
        NSObject中的对象方法,实为调用[self copyWithZone:nil],此方法在NSCopying协议中声明,
                因此需要用到copy的类需要遵守NSCopying协议并实现
                -(id)copyWithZone:(NSZone *)zone;方法(zone为OC历史遗留,现基本不用),
                        系统类的copy方法产生的对象均为inmutable,系统中inmutable对象的copy方法
                        实现为 :
                        -(id)copy
                        {
                                return [self copyWithZone:nil];
                        }
                        -(id)copyWithZone:(NSZone *)zone
                        {
                                return [[self retain] autorelease];
                        }
                       
mutableCopy:
                NSObject中的对象方法,实为调用[self mutableCopyWithZone:nil],此方法在NSMutableCopying协议中声明,
                因此需要用到mutableCopy的类需要遵守NSMutableCopying协议并实现
                -(id)mutableCopyWithZone:(NSZone *)zone;方法,
                        系统类的mutableCopy方法产生的对象均为mutable,为深复制,产生新对象;
                       
@property 中的copy参数:
                与retain都属于内存管理类参数,一般用于OC字符串
                                (NSString * ,NSMutableString *)与block类型的属性;
                手动实现为:
                -(void)setXxx:(NSString *)xxx
                {
                        if(_xxx!=xxx)
                        {
                                [_xxx release];
                                _xxx=[xxx copy];
                        }
                }
               
       
自定义类实现copy功能:
                由于自定义类基本无mutable与inmutable之分,因此实现中一般
                无论copy或mutableCopy都为产生新对象,copyWithZone与mutableCopyWithZone
                任意实现一个或都实现既可;
       
        一般实现方式(假设User类):
                //copy方法一般返回autorelease过的对象
        -(id)copyWithZone:(NSZone *)zone
        {
                User *user = [[User alloc] init];
                [user setXxx:[self xxx]];
                        ...
                return [user autorelease];
        }       


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马