copy: 创建一个引用计数为1的对象,然后释放旧的对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为 1
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化
retain到另外一个NSString之 后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。在拷贝之前,都会释放旧的对象。
1、使用copy: 对NSString
2、使用retain: 对其他NSObject和其子类
strong与weak是由ARC新引入的对象变量属性
ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。
@property(strong) MyClass *myObject;
相当于@property(retain) MyClass *myObject;
@property(weak) MyOtherClass *delegate;
相当于@property(assign) MyOtherClass *delegate;
强引用与弱引用的广义区别:
强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。
简单讲strong等同retain
weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻
alloc都是strong,weak只是一些数字类型,copy是字符串
控件一般为 weak
ARC
自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误。
同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存。
总是通过属性来管理实例变量(init/dealloc除外),在dealloc中释放所有属性。 dealloc中会自动加入释放实例变量的代码,因此不必要手段增加释放实例变量的代码。不需要手动调用[super dealloc]
不要调用retain,release,autorelease,编译器会自动插入相关代码。 注意命名方式,不要以copyXXX方式命名不想进行retain的方法,编译器会根据方法名自动retain。
C语言结构体中不要有对象指针
id和void*只能通过桥接转换来进行转换
不要使用NSAutoreleasePool,而是使用@autoreleasepool{}代码块。 转换ARC代码:Edit->Refactor->Convert to Objective-C ARC
strong 相当于retain。
Strong在ARC环境为默认属性类型。 @property (nonatomic,readwrite,strong)NSString *title;
@property (strong, nonatomic) UIViewController *viewController;
@property (nonatomic, strong) id childObject; Default
weak 取代之前的assign,对象销毁之后会自动置为nil,防止野指针。
Assign不能自动置为nil,需要手动置为nil。
Delegate基本总是使用weak,以防止循环引用。特殊情况是,希望在dealloc中调用delegate的某些方法进行释放,此时如果使用weak将引起异常,因为此时已经是nil了,那么采用assign更为合适。
@property (weak, nonatomic) IBOutlet UIButton *myButton;//处于最顶层的IBOutlet应该为strong
@property (nonatomic, weak) id parentObject;
@property(nonatomic,readwrite,weak) id <MyDelegate> delegate;
@property (nonatomic, weak) NSObject <SomeDelegate> *delegate;
assign 对基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char等) ’@property (nonatomic, assign) int n;
@property (nonatomic, assign) BOOL isOK;
@property (nonatomic, assign) CGFloat scalarFloat;
@property (nonatomic, assign) CGPoint scalarStruct; Default
retain NSObject及其子类。
Release旧值,retain新值。
Retain是指针复制(浅复制),引用计数加1,而不会导致内容被复制。 @property (nonatomic, retain)UIColor *myColor;
atomic Default
nonatomic 非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能
unsafe_unretained
copy 复制内容(深复制),如果调用copy的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。
@property (nonatomic,copy)NSString *title;
@property (nonatomic, copy) NSMutableArray *myArray;//not recommended
@property (nonatomic, copy) SomeBlockType someBlock;
readonly
readwrite Default
retain cycle
循环保留 delegate和block是产生retain cycle的主要原因
dealloc 移除观察者observers
注销通知notification
设置非weak的delegate为nil
取消timer
分享到:
相关推荐
IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义 我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,很多时候,我们仅仅只是按照习惯去写经常写...
@protocol ZSegmentedControlDelegate ...@property (nonatomic, weak)id <ZSegmentedControlDelegate> delegate; //@property (nonatomic, copy) void (^indexChangeBlock)(NSUInteger index);
7. strong 和 weak 属性:在 ARC(Automatic Reference Counting,自动引用计数)时代,retain 和 release 被替换为 strong 和 weak。strong 表示强引用,相当于原来的 retain,会增加对象的引用计数。weak 表示弱...
retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained 下面来分别讲讲各自的作用和区别: retain,计数器加1, (增加一个指向内存的指针) 对应release(计数器-1) setter 方法对参数进行 ...
十一、Strong 与 weak Strong 是一个强引用,对象在内存中存在的时间只要strong引用存在。Weak 是一个弱引用,对象在内存中存在的时间只要weak引用存在,但是对象一旦被释放,weak引用将被置为空。
在Objective-C中,修饰符(如copy、mutableCopy、strong、weak、assign)用于声明变量时的内存管理策略和属性的特性。例如,copy修饰符在复制不可变对象时只进行浅拷贝,它不会开辟新的内存空间,而是使新的指针指向...
1. 使用`weak`或`unsafe_unretained`引用代替`strong`引用,以打破循环引用。在ARC下,推荐使用`weak`,因为当对象释放时,`weak`引用会自动设为`nil`,避免野指针问题。 2. 对于代理(delegate)使用`weak`或`...
1. **__strong引用**:默认情况下,Block会创建对捕获对象的强引用,可能导致循环引用,引发内存泄漏。例如,一个Block内部引用了一个对象,而这个对象又持有了Block,两者互相引用,无法释放。 2. **__weak引用**:...
2. 如果你从某个地方获取了一个对象(例如通过retain、copy、或者strong属性),你也就拥有了这个对象。需要在不再需要时对它执行release或者ARC会帮你处理。 3. 如果你不拥有一个对象,就不要释放它。这可能会导致...
- **strong、weak、retain、assign、copy等的区别**: - **strong**:强引用,对象的所有权归当前属性所有,会增加对象的引用计数。 - **weak**:弱引用,不增加对象的引用计数,当对象被释放后,指针会被置为nil...
11. strong与weak,以及Unsafe_unretained与weak的区别: - strong表示强引用,ARC会自动插入retain。weak表示弱引用,类似于手动管理内存的assign。 - Unsafe_unretained与weak的区别在于,当对象被销毁后,weak...
3. **Block**:使用`__weak`修饰`self`来避免循环引用,但在某些场景下可能需要在block内部使用`__strong`来确保对象在block执行期间有效。 六、悬垂指针与野指针 - **悬垂指针**:指向已被释放内存的指针,继续...
最后,strong与weak关键字用于属性的声明,它们分别表示强引用和弱引用。在ARC下,strong告诉编译器自动管理对象的所有权,而weak则不增加引用计数,类似手动管理的assign。另外,_unsafe_unretained与weak类似,但...
3. 引用计数:retain(或strong)用于增加对象的引用计数,assign常用于基本数据类型,可能导致悬垂指针问题。weak不会增加引用计数,当对象释放后,weak指针会自动设为nil。copy分为浅拷贝和深拷贝,浅拷贝仅复制...
2. 使用Block的copy方法:Block在ARC下默认为`__strong`,可以通过`__unsafe_unretained`或`__weak`修饰来弱引用对象。但这并不安全,因为对象可能在Block执行前被释放。更推荐使用`weakSelf`。 3. 使用...
6. **NSString与copy/strong**:NSString是不可变对象,通常使用strong进行引用。而当需要拷贝一个字符串时,应使用copy关键字以确保新对象独立。 7. **ARC(Automatic Reference Counting)**:ARC是iOS中的自动...
在ARC环境下,指针可以拥有两种类型的角色:strong(强引用)和weak(弱引用)。Strong指针意味着它持有对象的所有权,只要至少有一个strong指针指向一个对象,该对象就不会被销毁。当最后一个strong指针被释放或...
当我们在类接口中声明一个@property,OC编译器会自动生成对应的setter和getter方法,同时处理内存管理(在ARC时代之前是retain、release等,现在是strong、weak等)。例如: ```objc @interface Person : NSObject ...