copy,strong,weak 简单使用

来源:互联网 发布:软件授权方法 编辑:程序博客网 时间:2024/05/22 09:49

最近在面试,很多面试问道了copy,strong,weak,对此我之前没有做过太多的研究,以至于很吃亏。

我们不仅仅要只是使用,更多的我们要理解。

比如声明的一个NSString *str变量,然后把一个NSMutableString *mStr变量的赋值给它了,如果要求str跟着mStr变化,那么就用retain;如果str不能跟着mStr一起变化,那就用copy。而对于要把NSString类型的字符串赋值给str,那两都没啥区别。不会影响安全性,内存管理也一样。

@property (retain,nonatomic) NSString *rStr;

@property (copy, nonatomic)   NSString *cStr;

   NSString * STRING =@"WWW.BAIDU.COM";

  NSMutableString *mStr = [NSMutableString stringWithFormat:@"%@",STRING];

   self.rStr   = mStr;

   self.cStr     = mStr;

   [mStr appendString:@"de"];

  NSLog(@"mStr:%@",  mStr);

   NSLog(@"retainStr:%@",  _rStr);

   NSLog(@"copyStr:%@",    _cStr);

打印数据:

 WWW.BAIDU.COMde

WWW.BAIDU.COMde

WWW.BAIDU.COM



    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"hello",@"world",@"baby",nil];

    NSArray *array2 = [array copy];

    [array removeAllObjects];

    CFShow((__bridge CFTypeRef)(array2));

    CFShow((__bridge CFTypeRef)(array));

打印数据:

 (

    hello,

    world,

    baby

)

(

)

可以看出copy是一种复制,对数据进行的复制。




weak and strong property (强引用和弱引用的区别)

只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)

具体一点:IBOutlet可以为weak,NSString为copy,Delegate一般为weak,其他的看情况。一般来说,类“内部”的属性设置为strong,类“外部”的属性设置为weak。说到底就是一个归属权的问题。小心出现循环引用导致内存无法释放

 

  • strong:等同于"retain",属性成为对象的拥有者
  • weak:属性是 weak pointer,当对象释放时会自动设置为 nil
  • unsafe_unretained:等同于之前的"assign",只有 iOS 4 才应该使用
  • copy:和之前的 copy 一样,复制一个对象并创建 strong 关联
  • assign:对象不能使用 assign,但原始类型(BOOL、int、float)仍然可以使用 

@property (nonatomic,strongNSString *string1;

@property (nonatomic,weak)   NSString *string2;


    NSString *string111 = [[NSString alloc] initWithFormat:@"dasdasdasda"];

    self.string2 = string111;

    string111 = @"aaaaa";;

     NSLog(@"String 2 = %@", self.string2);    //String 2 = (null)

    

    NSString *string121 = @"dasdas";

    self.string2 = string121;

    string121 = nil;

    NSLog(@"String 2 = %@", self.string2);    //String 2 = dasdas

alloc创建的对象堆内存,栈内存由系统来管理

对于动态分配我们可以去处理,对于weak的弱引用请看:http://m.blog.csdn.net/blog/q199109106q/8565017



在过程中我们还遇到一个好玩的

    NSString *string111 = [[NSString alloc] initWithFormat:@"dasdasdasda"];

    self.string2 = string111;

    self.string1 = string111;

    string111 = nil;

    NSLog(@"String 2 = %@", self.string2);    //String 2 = dasdasdasda

    NSLog(@"string 1 = %@", self.string1);    //String 2 = dasdasdasda

我们在中间对string1进行了一次赋值,就出现了这种情况,怎么回事?  

我想strong属性应该是给我们开了一个玩笑,strong=retain,在这时候不仅仅复制了控件内容,还复制了控件地址。



个人研究理解:如有错误,请留言指正


0 0