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


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中删除第一个对象后两个引用中的第一个元素都会消失。

这在内存中创建了两个不同的可变数组。

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