简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,reado
2016-05-18 14:56
691 查看
OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。readwrite(默认):可读可写,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,没有setter方法。nonatomic:不考虑线程安全。atomic(默认):线程操作安全。strong(默认):ARC下和MRC下retain一样,weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil,防止野指针。
unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针。
线程安全下的setter和getter方法:
(NSString *)value{
@synchronized(self){
return [[_value retain] autorelease];
}
}
(void)setValue:(NSString *)aValue{
@synchronized(self){
[aValue retain];
[_value release];
_value = aValue;
}
}
unsafe_unretained声明一个若引用,但不会自动置为nil,可能会出现野指针。
线程安全下的setter和getter方法:
(NSString *)value{
@synchronized(self){
return [[_value retain] autorelease];
}
}
(void)setValue:(NSString *)aValue{
@synchronized(self){
[aValue retain];
[_value release];
_value = aValue;
}
}
相关文章推荐
- 主题 : clang: error: linker command failed with exit code 1 (use -v to see invocation)
- LeetCode Climbing Stairs(经典动态规划)
- Makefile 没有规则创建目标“main.o”需要的目标“main.c”
- LeetCode 217. Contains Duplicate
- DailyNote
- Creating schema using Saiku Schema Designer
- Codeforces Round #353 (Div. 2) E. Trains and Statistic(求d[i][j]的和的最小值(1<=i<=n,i+1<=j<=n))
- SendKeys.SendWait()BUG解决方法
- Cookie未设置Domain
- Error:Failed to create directory 'C:\Users\Administrator\.gradle\caches\2.8\scripts\ijinit7_5jx13p26
- django错误 - Reason given for failure: CSRF cookie not set.
- 简单动态规划 climbing-stairs
- codeforces E. Trains and Statistic 线段树优化dp
- Execution failed for task ':dexDebug'
- poj2256人工智能?其实就是字符串处理啦
- 调用系统文件管理器选择图片,调用系统裁剪AIP对图片处理,显示裁剪之后的图片
- saltstack[5]-grains
- NeHe's Opengl 06:纹理映射 initialization failed和Unknown DIB file format
- 11. Container With Most Water
- UVa-514-Rails