------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
@property中的copy关键字
1、@property中copy的作用
分析代码:
//创建可变字符串
NSMutableString *str = [NSMutableString string];
//设定字符串的内容
str.string = @"zhangsan";
//创建对象
Person *person = [Person new];
//给person的实例变量赋值 person.name = str;
//修改字符串内容
[str appendString:@"xxxx"];
NSLog(@"name = %@",person.name);
NSLog(@"str = %@",str);
这显然不符合我们的要求,因为str修改后,会影响person.name的值
解决方法:
@property (nonatomic,copy) NSString *name;
set方法展开形式为:
- (void)setName:(NSString*)name
{
if (_name !=name) {
[_name release];
_name = [name copy];
}
}
2、@property内存管理策略选择
1.非ARC
1>copy : 只用于NSString\block
2>retain : 除NSString\block以外的OC对象
3>assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用
retain,一端用assign
2.ARC
1>copy : 只用于NSString\block
2>strong : 除NSString\block以外的OC对象
3>weak : 当2个对象相互引用,一端用strong,一端用weak
4>assgin : 基本数据类型、枚举、结构体(非OC对象)
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic,copy) NSString *name;
@end
@implementation Person
- (void)dealloc
{
[_name release];
NSLog(@"Person dealloc");
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
// p.name = @"张三";
// NSLog(@"p.name = %@",p.name);
NSMutableString *str = [NSMutableString string];
[str appendString:@"张无忌"];
//设置姓名
p.name = str;
NSLog(@"p.name = %@",p.name); //张无忌
[str appendString:@"&老顽童"];
NSLog(@"p.name = %@",p.name); //张无忌
[p release];
}
return 0;
}</span>