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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

彭智林老师

  • 黑马币:26

  • 帖子:12

  • 精华:0

好给力 赞一个
回复 使用道具 举报
赞一个,清楚多了
回复 使用道具 举报
老师可以讲一下设置了快速构造方法时,NSString属性的赋值是用copy么,用不用考虑retain和release
回复 使用道具 举报
66666666666
回复 使用道具 举报
讲解很到位,虽然现在基础薄弱,但像"僵尸对象"和"空指针"还能看懂点,挺好的讲解
回复 使用道具 举报
jdc123 发表于 2016-5-29 11:08
老师可以讲一下设置了快速构造方法时,NSString属性的赋值是用copy么,用不用考虑retain和release ...

用copy比用retain安全,当是NSString的时候,其实用copy和retain都行,当用NSMutableString,那么就要用copy,使得NSMutableString的值不会被修改,而用retain的时候,NSMutableString的值会被修改。
举个例子
  1. @interface person : NSObject<NSCopying>
  2. @property (nonatomic,copy)NSString * name;
  3. @end
复制代码
  1. person * p  = [[person alloc]init];
  2.    
  3.     NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"];
  4.     p.name = name;
  5.    
  6.     [name appendString:@" word"];
  7.     NSLog(@"%@",p.name);
复制代码

可以发现打印结果还是hello;

如果你的name属性是用retain修饰,则打印的是hello word;
回复 使用道具 举报
jdc123 发表于 2016-5-29 11:08
老师可以讲一下设置了快速构造方法时,NSString属性的赋值是用copy么,用不用考虑retain和release ...

用copy比用retain安全,当是NSString的时候,其实用copy和retain都行,当用NSMutableString,那么就要用copy,使得NSMutableString的值不会被修改,而用retain的时候,NSMutableString的值会被修改。
举个例子:
  1. @interface person : NSObject<NSCopying>
  2. @property (nonatomic,copy)NSString * name;
  3. @end
复制代码
  1. person * p  = [[person alloc]init];
  2.    
  3.     NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"];
  4.     p.name = name;
  5.    
  6.     [name appendString:@" word"];
  7.     NSLog(@"%@",p.name);
复制代码

可以发现打印结果还是hello;

如果你的name属性是用retain修饰,则打印的是hello word;
回复 使用道具 举报
jdc123 发表于 2016-5-29 11:08
老师可以讲一下设置了快速构造方法时,NSString属性的赋值是用copy么,用不用考虑retain和release ...

用copy比用retain安全,当是NSString的时候,其实用copy和retain都行,当用NSMutableString,那么就要用copy,使得NSMutableString的值不会被修改,而用retain的时候,NSMutableString的值会被修改。
举个例子
  1. @interface person : NSObject<NSCopying>
  2. @property (nonatomic,copy)NSString * name;
  3. @end
复制代码
  1. person * p  = [[person alloc]init];
  2.    
  3.     NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"];
  4.     p.name = name;
  5.    
  6.     [name appendString:@" word"];
  7.     NSLog(@"%@",p.name);
复制代码

可以发现打印结果还是hello;

如果你的name属性是用retain修饰,则打印的是hello word;
回复 使用道具 举报
66666666666666666666
回复 使用道具 举报
彭智林老师 发表于 2016-5-31 00:12
用copy比用retain安全,当是NSString的时候,其实用copy和retain都行,当用NSMutableString,那么就要用copy, ...

谢谢老师解答,关于快速构造方法我还是有些不明白,比如你举得这个例子,在ARC机制下,类声明时候用@proerty(nonatomic,copy)NSString *name定义属性,而我有快速设定对象属性初值的需求(利用重写构造方法,在对象申请时候直接给属性赋值那种),在快速构造方法实现时候,我用不用考虑内存问题,是这样重构
if(self=[super init]){
if(_name!=name){
[_name release];
_name = [name copy];}
return self;
}还是直接赋值
if(self=[super init]){
_name = [name copy];
return self;}
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马