A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wdcew 中级黑马   /  2015-8-12 12:24  /  1500 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


4 个回复

倒序浏览
字体太小了吧?
回复 使用道具 举报
您好,请问这是第几天的内容啊,我怎么看视频没有这部分?
回复 使用道具 举报
紫荆秋雪 发表于 2015-8-12 21:18
您好,请问这是第几天的内容啊,我怎么看视频没有这部分?

这是我自己看书总结的,没有看视频
回复 使用道具 举报
wdcew 发表于 2015-8-12 23:09
这是我自己看书总结的,没有看视频

哦,谢谢!,因为我在做入学考试,结果就有这些内容
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马