//如果希望 修改一个数组、字典或是集合中复制了 副本中的某一个元素如array2[0],但是不修改原本的数组等等,如不能修改 array[0],如何操作
// 单独建立某一元素的副本。
mStr = [NSMutableString stringWithString: dataArray[0]];
[mStr appendString: @"111"];
// 将mstr对象的内存地址 存储在 array2[0]中
[dataArray2 replaceObjectAtIndex: 0 withObject: mStr];
NSLog(@"%@", dataArray2[0]);
//故,当修改 mStr对象的 字符串时,dataArray[0]中得元素也会改变(因为他们指向同一地址);
实现<NSCopying>协议
如果尝试使用自己类(例如,地址簿)中得 copy方法,语句如下:
NewBook = [myBook mutableCopy];
将会受到一条出错消息,内容如下: Selector not recognized
要实现自己的类进行复制,必须根据<NSCoping>协议实现起一个两个方法。
实现协议时,必须实现 copyWithZone: 方法,因为 方法 copy 也仅仅是 将一条带有 nil参数的copyWithZone: 的类发给你得对象而已。 思考:1. 为什么该类 不需要 @protocol(协议声明) 2. 为什么该类不需要 实现 copy方法 3. 在何种情况下编写 MutableCopy方法 4.如果 该类有子类,方法 copyWithZone:(NSZone *)zone 被继承,下面的方法有什么错误!!!(非常重要) /* @protocol NSCopying -(id) copy; -(id) copyWithZone: (NSZone *) zone; @optional -(void) printf; @end */ //----@intreface部分---- @interface Fraction : NSObject<NSCopying> implementation部分 @implementation Fraction -(id) copyWithZone:(NSZone *)zone { Fraction *newFarct = [[Fraction allocWithZone: zone] init]; [newFarct setNumerator: numerator setDenominator: denominator]; return newFarct; } 个人见解 :1. 在它的父类已经有了@protocol 2.在父类中已经实现 copy的方法。 3.在一些 字符串对象、字典、或是数组对象的构建时,可以使用该方法 4.上述代码中的: Fraction *newFarct = [[Fraction allocWithZone: zone] init]; 修改成 id newFarct = [[[self class] allocWithZone: zone] init]; 因为我们要从该类分配一个对象,这个类的接受者,应该与使用方法的类一致,而不是参数 类的父类或是超类。
|