01-面试之内存管理
2016-03-03 10:59
288 查看
1:OC使用的"引用计数机制"管理对象.如果对一个对象使用了alloc,[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease.
*自己生成并持有对象<alloc, new, copy,mutableCopy等>,持有对象<retain>,释放对象<realease>,废弃对象<dealloc>.
*autoreleasepool延迟减1, 和autoreleasepool结合在一起使用,
*autoreleasepool的作用是将声明为autoreleasepool的对象丢进离他最近的自动释放池(@autoreleasepool)中, 当执行到左大括号时自动释放池销毁时, 会为池中的每一个对象都发送一个release消息
/**********************\
MRC(manual reference counting)
MRC常见内存问题:
1.野指针问题:访问不该访问的内存, 空间已经被系统回收,已经无权访问. 安全隐患
2.过度释放:对同一块空间释放多次, 程序立即Crash
3.内存泄露:空间使用完之后没有立即回收. 造成内存泄露. 安全隐患, 某一天crash
assign:针对于基本数据类型, 也可以针对于对象, 比如代理
retain:只能针对与对象, 引用计数+1
copy:只能针对与对象, 开辟新的空间, 原有对象引用计数不变, 新的对象引用计数+1.
当把属性的语义特性声明为retain/copy之后, 最后一次retain/copy的引用计数+1操作, 没有对应引用计数-1操作, 所以需要重写dealloc方法, 将最后一次retain/copy对应上release.
*属性的修饰
1:原子特性(和线程有关)atomic,noatomic
2:语义特性(和内存相关)assign,retain,copy
*语义特性为assign时set方法get方法
@synthesize age = _age;
- (void)setAge:(NSInteger)age {
_age = age;
}
- (NSInteger)age {
return _age;
}
*语义特性为retain时set方法get方法
@synthesize name = _name;//如果自己实现setget方法,需要添加@synthesize如果不添加就不会自动生成实例变量
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (NSString *)name {
return [[_name retain] autorelease];
}
*语义特性为copy时set方法get方法
@synthesize name = _name;
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (NSString *)name {
return [[_name retain] autorelease];
}
/**********************\
ARC(automatic reference counting)
[string retainCount];//获取当前对象的计数
*自己生成并持有对象<alloc, new, copy,mutableCopy等>,持有对象<retain>,释放对象<realease>,废弃对象<dealloc>.
*autoreleasepool延迟减1, 和autoreleasepool结合在一起使用,
*autoreleasepool的作用是将声明为autoreleasepool的对象丢进离他最近的自动释放池(@autoreleasepool)中, 当执行到左大括号时自动释放池销毁时, 会为池中的每一个对象都发送一个release消息
/**********************\
MRC(manual reference counting)
MRC常见内存问题:
1.野指针问题:访问不该访问的内存, 空间已经被系统回收,已经无权访问. 安全隐患
2.过度释放:对同一块空间释放多次, 程序立即Crash
3.内存泄露:空间使用完之后没有立即回收. 造成内存泄露. 安全隐患, 某一天crash
assign:针对于基本数据类型, 也可以针对于对象, 比如代理
retain:只能针对与对象, 引用计数+1
copy:只能针对与对象, 开辟新的空间, 原有对象引用计数不变, 新的对象引用计数+1.
当把属性的语义特性声明为retain/copy之后, 最后一次retain/copy的引用计数+1操作, 没有对应引用计数-1操作, 所以需要重写dealloc方法, 将最后一次retain/copy对应上release.
*属性的修饰
1:原子特性(和线程有关)atomic,noatomic
2:语义特性(和内存相关)assign,retain,copy
*语义特性为assign时set方法get方法
@synthesize age = _age;
- (void)setAge:(NSInteger)age {
_age = age;
}
- (NSInteger)age {
return _age;
}
*语义特性为retain时set方法get方法
@synthesize name = _name;//如果自己实现setget方法,需要添加@synthesize如果不添加就不会自动生成实例变量
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (NSString *)name {
return [[_name retain] autorelease];
}
*语义特性为copy时set方法get方法
@synthesize name = _name;
- (void)setName:(NSString *)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}
- (NSString *)name {
return [[_name retain] autorelease];
}
/**********************\
ARC(automatic reference counting)
[string retainCount];//获取当前对象的计数
相关文章推荐
- 百度的面试题 合并两个有序的数组
- 程序员必须知道的10大基础实用算法及其讲解
- 码农如何克服“职业病”
- 国内某电商大佬面试题
- .NET面试题解析(02)-拆箱与装箱
- 如何从菜鸟程序员成长为(伪)高手
- 为什么你投十份简历,只有一两家公司约你?又或者为什么你每投一份简历都能获得面试机会?
- 专访|十年程序员董一凡:生命不息,学习不止
- “要出发” 公司面试题及答案
- php程序员网址大全
- 程序员,向左或向右
- OSChina 周四乱弹 ——喜欢程序员不,那可不咋地!
- 面试
- 前端工程师是怎样一种职业
- 游戏程序员的工作是怎样的?
- Java面试题-try...finally结构中try中有return那么finally中的语句的执行时间问题
- 1*2*3*……*100 求结果末尾有多少个零 网上的答案到底对不对
- android 面试小知识
- 关于PHP程序员解决问题的能力
- 能比得上房价涨幅的只有程序员的薪资了