关于OC对象拷贝的问题

简介: 先来打一下实例: 创建一个Person类: Person.h: #import @interface Person : NSObject@property(nonatomic,assign) int age;@property(nonatomic,retain) NSString *name;@end Person.

先来打一下实例:

创建一个Person类:

Person.h:

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying>

@property(nonatomic,assign) int age;
@property(nonatomic,retain) NSString *name;

@end


Person.m:

#import "Person.h"

@implementation Person

- (id)init
{
    self = [super init];
    if (self) {
        self.name = @"xiaoming";
        self.age = 22;
    }
    return self;
}
//构造拷贝函数,虽然说内存管理的原则是谁retain谁release,但是对copy来说比较特殊,是放在外面release的
-(id)copyWithZone:(NSZone *)zone
{
    Person *p = [[Person allocWithZone:zone] init];
    p.name = self.name;  //浅拷贝,只是拷贝了地址
    p.age = self.age;   
    
    //深拷贝
    //p.name = [self.name copy];//内容拷贝一份
    return p;
}

- (void)dealloc
{
    [_name release];
    [super dealloc];
}

@end

main:

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Person *p = [[Person alloc] init];
        p.age = 11;
        NSMutableString *str = [NSMutableString stringWithFormat:@"xiaohua"];
        p.name = str;
        NSLog(@"person age = %d name = %@",p.age,p.name);
        
        Person *p1 = [p copy];
        [str appendString:@"1"]; //在原来的基础上加1
        NSLog(@"person age = %d name = %@",p.age,p.name); //验证原来的对象是否改变
        NSLog(@"p1 age = %d name = %@",p1.age,p1.name);  //打印当然的拷贝对象,这个要看前面的拷贝实现的函数是深拷贝还是浅拷贝
        
        [p1 release];
        [p release];
    }
    return 0;
}


浅拷贝结果:

2013-08-05 11:35:39.688 对象拷贝[862:303] person age = 11 name = xiaohua

2013-08-05 11:35:39.690 对象拷贝[862:303] person age = 11 name = xiaohua1

2013-08-05 11:35:39.691 对象拷贝[862:303] p1 age = 11 name = xiaohua1

深拷贝:

2013-08-05 11:39:26.579 对象拷贝[892:303] person age = 11 name = xiaohua

2013-08-05 11:39:26.581 对象拷贝[892:303] person age = 11 name = xiaohua1

2013-08-05 11:39:26.582 对象拷贝[892:303] p1 age = 11 name = xiaohua



相关文章
|
4月前
|
Java Apache
Java将一个对象的属性复制到另一个对象
【5月更文挑战第18天】Java将一个对象的属性复制到另一个对象
542 2
|
4月前
|
编译器 C++
OC如何实现函数参数对象的地址传
OC如何实现函数参数对象的地址传
31 0
|
4月前
函数参数传递_使用引用避免拷贝
函数参数传递_使用引用避免拷贝
24 0
|
存储 iOS开发
OC的类信息存放在哪里,看完千万别说还不知道
这篇行文主要介绍OC的类信息具体存放在哪个位置。在了解这个之前,要先明白 Objective-C中的对象(后称OC对象),主要可以分为哪几种,如下: 1、instance对象(实例对象) 2、class对象(类对象)-https://so.csdn.net/so/search?q=%E7%B1%BB%E5%AF%B9%E8%B1%A1&spm=1001.2101.3001.7020 3、meta-class对象(元类对象)
268 0
OC的类信息存放在哪里,看完千万别说还不知道
|
编译器 C++
C++中要完整拷贝对象
C++中要完整拷贝对象
166 0
|
iOS开发 C++
几个示例带你去了解OC对象是怎么分配内存的
1、64位系统环境的OC对象最小分配内存为16字节。 2、结构体内存对齐,是指在计算结构体大小的时候,其分配的原则:结构体大小必须是最大成员变量分配内存的倍数。 3、iOS操作系统在分配内存的时候,也有内存对齐的概念,为16的倍数 :在iOS的堆空间中,如果要创建一个OC对象,分配内存时,都是16的倍数。
201 0
|
存储 C++ 块存储
C++对象的复制——具有指针成员的类的对象的复制
//smartvessel@gmail.com class Table{Name * p;size_t sz;publish:Table(size_t s = 15){p = new Name[sz=s];}~Table(){delete[]p ;}.
951 0