黑马程序员——OC语言加强---@property中的copy关键字

                                                                                    ------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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值