Object C 复制对象

  在简单的赋值语句中将对象赋值给另一个对象:

origin = pt;
    其中origin 和 pt 都是带有两个整型实例变量x和y的XYPoint 对象,这样的赋值结果仅仅是将对象pt 的 地址复制到origin中,赋值操作结束后 两个变量都指向内存中的同一个地址。当使用一条消息对实例变量进行修改:

[origin setX:100 andY:300]
     这时同时改变了origin和pt变量共同引用的XYPoint对象的x,y坐标,因为它们都引 用内存中同一个对象

     这样同时适用于Foundation对象:将一个对象赋值给另一个对象仅仅是创建了一个对这个对象的引用。所以,如果dataArray 和dataarray2 都是NSMutableArray对象:

dataArray2 = dataArray;
[dataArray2 removeObjectAtIndex:0];

     这个操作将对两个变量引用的同一个数组中删除第一个元素。

1.  copy和mutableCopy方法

     Foundation 类实现了名为copy 和mutableCopy的方法,可以使用这些方法创建对象的副本。通过实现符合<NSCopying> 协议(用于制作副本)的方法来完成此任务。如果类必须区分要产生的对象的是可变副本还是不可变副本,还需要<NSMutableCopying>协议实现一个方法。

     如Foundation 类中的copy方法,在前面描述的两个NSMutableArray对象dataArray2和dataArray, 语句:

dataArray2 = [dataArray mutableCopy]
     在内存中创建一个dataArray副本,并复制了它的所有元素。执行语句:

[dataArray2 removeObjectAtIndex:0]
      上面删除了dataArray2中的第一个元素,但不删除dataArray中的第一个元素。  下面代码详细展示:

#import <Foundation/Foundation.h>

int main (int argc, char *argv[])
{
    @autoreleasepool{
         NSMutableArray *dataArray = [NSMutableArray arrayWithObjects: @"one",@"two", @"three",nil];
         NSMutableArray *dataArray2;
         //简单复制
         dataArray2 = dataArray;
         [dataArray2 removeObjectAtIndex:0]   
         NSLog(@"dataArray: ");
         for (NSString *elem in dataArray)
              NSLog(@“%@”,elem);
          
         NSLog (@"dataArray2: ");
         
         for (NSString *elem in dataArray2)
               NSLog (@"%@",elem);
         //创建一个可变副本
         dataArray2 = [dataArray mutableCopy];
         [dataArray2 removeObjectAtIndex:0];
         NSLog (@"dataArray: ");
         for (NSString *elem in dataArray)
               NSLog(@"%@", elem);
          
         NSLog (@"dataArray2: ");
            for (NSString *elem in dataArray2)
                 NSLog (@" %@", elem);
       }
        return 0;
}
         输出结果:

dataArray:
    two
    three
    four
dataArray2:
    two
    three
    four
dataArray:
    two
    three
    four
dataArray2:
    three
    four
       dataArray2 = dataArray;   仅仅创建了对内存中同一个对象的另一个引用。在从dataArray2中删除第一个对象后两个引用中的第一个元素都会消失。

       然后创建一个dataArray的可变副本并将它赋值给dataArray2的最终副本:这在内存中创建了两个不同的可变数组。

       注意:产生一个对象的可变副本并不要求被复制的对象本身是可变。这种情况同样适用于不可变副本:可以创建可变对象的不可变副本。
2. 浅赋值与深复制



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值