黑马程序员技术交流社区

标题: 实现<NSCopying>协议 [打印本页]

作者: wdcew    时间: 2015-8-12 12:24
标题: 实现<NSCopying>协议
//如果希望 修改一个数组、字典或是集合中复制了 副本中的某一个元素如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];
因为我们要从该类分配一个对象,这个类的接受者,应该与使用方法的类一致,而不是参数 类的父类或是超类。



作者: wangchao1992    时间: 2015-8-12 13:13
字体太小了吧?
作者: 紫荆秋雪    时间: 2015-8-12 21:18
您好,请问这是第几天的内容啊,我怎么看视频没有这部分?
作者: wdcew    时间: 2015-8-12 23:09
紫荆秋雪 发表于 2015-8-12 21:18
您好,请问这是第几天的内容啊,我怎么看视频没有这部分?

这是我自己看书总结的,没有看视频
作者: 紫荆秋雪    时间: 2015-8-13 07:28
wdcew 发表于 2015-8-12 23:09
这是我自己看书总结的,没有看视频

哦,谢谢!,因为我在做入学考试,结果就有这些内容




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2