retain strong 和 copy 讨论,有建议的的童鞋请留言

总结下我的理解:

strong weak是ARC引入的,strong相当于retain,但是对于有的类型,例如NSString,则使用strong相当于使用copy

这样直接用strong就可以直接处理retain和strong的情况了。

weak相当于assign,但是比后者多一点:对象被干掉时会将weak引用设为nil,而对nil发送消息都不会导致崩溃

否则weak引用为野指针,会出现问题

这里说strong 有copy的功能是错误的哦。实验例子

@interface AppDelegate : UIResponder <UIApplicationDelegate>

{

NSString *retainStr;

NSString *copStr;

NSString *strongStr;

}

@property (retain, nonatomic) NSString *retainStr;

@property (strong, nonatomic) NSString *strongStr;

@property (copy, nonatomic) NSString *copStr;

@end

NSMutableString *newStr = [NSMutableString stringWithFormat:@"abcd"];

self.retainStr = newStr;

self.strongStr = newStr;

self.copStr = newStr;

[newStr appendString:@"123"];

NSLog(@"retain sting:%@", self.retainStr);

NSLog(@"strong string:%@", self.strongStr);

NSLog(@"copy string:%@", self.copStr);

输出结果:

2014-05-02 13:31:17.660 TestMultipleThreadDownload[552:60b] retain sting:abcd123

2014-05-02 13:31:17.662 TestMultipleThreadDownload[552:60b] strong string:abcd123

2014-05-02 13:31:17.663 TestMultipleThreadDownload[552:60b] copy string:abcd

时间: 2024-12-20 19:31:11

retain strong 和 copy 讨论,有建议的的童鞋请留言的相关文章

关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. NSObject对象的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样: NSLock *_lock = [[NSLock alloc]ini

assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

arc其实并不是所谓的垃圾回收机制,其实arc只是编译器的一种特性,编译器会在编译阶段插入相应的内存管理代码,以实现自动的内存管理,这样就减少了因为程序员的一时疏忽或者项目过大而失误从而造成内存泄露,因为是编译器自动完成的代码插入所以arc的效率要高于垃圾回收机制. 在arc机制下dealloc中会由编译器自动插入释放属性的代码因此也不需要手动调用[super dealloc],当然arc只能管理foundation层的对象对于core foundation层的变量需要程序员手动去释放或者使用桥

retain、strong和copy测试

时不时会有点迷惑retain.strong.copy三者之间的区别,还是记录下来好一点,先看代码: 创建一个类,定义属性 #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, retain) NSString *strRetain; @property (nonatomic, strong) NSString *strStrong; @property (nonatomic, c

18-NSString之Strong和copy

NSString属性什么时候用copy,什么时候用strong? 2015-05-12  iOS开发 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子. 示例   我们定义一个类,并为其声明两个字符串属性,如下所示: @interface TestStringClass () @property (nonatomic, strong) NS

strong和copy的区别

strong和copy的区别 问题描述 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰.为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化. 代码示例 还是结合代码来说明这个情况 @interface Person : NSObject @property (strong, nonat

iOS之strong和copy

深拷贝和浅拷贝 深拷贝和浅拷贝主要是对类类型而言的,浅拷贝就是指针拷贝,深拷贝是对象拷贝. property的strong和copy 在接触iOS程序时经常会看到程序某些类类型属性被strong修饰,某些被copy修饰,刚开始接触时有些疑惑,后来不知咋地形成了这样的观念,对于mutable类型,用copy修饰,对于immutable类型,用strong修饰,现在看来这个大大地错了. 创建属性是一件机械化的工作:对于一般的属性,你会将它们声明为 nonatomic.默认情况下,对象属性是stron

iOS 关键词assign、strong、copy、weak、unsafe_unretained

关键词assign.strong.copy.weak.unsafe_unretained 影响: 是否开辟新的内存 是否有引用计数增加 strong 指向并拥有该对象.其修饰的对象引用计数会 +1,该对象只要引用计数不为 0 就不会销毁,置为 nil 可以销毁它.一般用于修饰对象类型.字符串.集合类的可变版本NSMutable. // .h 文件 @property (nonatomic, strong) NSMutableArray * nArr; // .m 文件 { NSMutableAr

属性设置@property之retain,assign,weak,strong,copy

1.assign assign只是简单赋值,不更改索引计数,适用于基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等) 2.copy copy用来建立一个索引计数为1的对象,然后释放旧对象, 常用语NSString ,指在赋值时使用传入值的一份拷贝. 3.retain retain用来释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 对其他NSObject和其子类,对参数进行release旧值,再ret

转 iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

    自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误.     同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存.     总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性. dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码.不需要手动调用[super  dealloc]   不要调用retain,release,autorelease,编译器会自动插入相关代码. 注