您的位置 首页 > 数码极客

iosarc如何释放内存

最近开始参加一些iOS移动端开发的面试,虽然参加的面试不多。我根据自己的情况做了一下总结,答案是我总结的,如有答的不好的地方,希望批评指正以及交流,谢谢!

一、内存管理

1.什么是ARC?

ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release。在对象被创建时retain count+1,在对象被release时count-1,当count=0时,销毁对象。程序中加入autoreleasepool对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。那么ARC是为了解决MRC手动管理内存存在的一些而诞生的。

ios内存存管理,可以细聊3163194867

MRC下内存管理的缺点:

1.释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)

2.释放指针指向的堆空间,首先要确定哪些指向同一个堆,这些指针只能释放一次。(避免释放多次,造成内存泄露)

3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁释放

4.多线程操作时,不确定哪个线程最后使用完毕。

虽然ARC给我们编程带来的很多好多,但也可能出现内存泄露。如下面两种情况:

1.循环参照

A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

2.死循环

如果有个ViewController中有无限循环,也会导致即使ViewController对应的view消失了,ViewController也不能释放。

2.block一般用那个关键字修饰,为什么?

block一般使用copy关键之进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,方法内容的block是在栈区的,使用copy可以把它放到堆区。但在ARC中写不写都行:编译器自动对block进行了copy操作。

3.用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

答:用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例。这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。

4.runloop、autorelease pool以及线程之间的关系

每个线程(包含主线程)都有一个Runloop。对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个像callstack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

5. @property 的本质是什么?ivar、getter、setter 是如何生成并添加到这个类中的。

“属性”(property)有两大概念:ivar(实例变量)、存取方法(access method=getter),即@property = ivar + getter + setter。

例如下面的这个类:

[objc] view plaincopy

@interface WBTextView :UITextView

@property (nonatomic,copy)NSString *placehold;

@property (nonatomic,copy)UIColor *placeholdColor;

@end

类完成属性的定以后,编译器会自动编写访问这些属性的方法(自动合成autosynthesis),上述代码写出来的类等效与下面的代码:

[objc] view plaincopy

@interface WBTextView :UITextView

- (NSString *)placehold;

-(void)setPlacehold:(NSString *)placehold;

-(UIColor *)placeholdColor;

-(void)setPlaceholdColor:(UIColor *)placeholdColor;

@end

详细介绍见:

6.分别写一个setter方法用于完成@property (nonatomic,retain)NSString *name和@property (nonatomic,copy) NSString *name

原则是先释放旧值,再给旧值赋值。

[objc] view plaincopy

-(void)setName:(NSString *)name

{

[_name release];

_name = [name retain];

}

[objc] view plaincopy

-(void)setName:(NSString *)name

{

[_name release];

_name = [name copy];

}

7.说说assign vs weak,_block vs _weak的区别

assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。

assign其实页可以用来修饰对象,那么为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续内存分配中,刚才分到了这块地址,程序就会崩溃掉。而weak修饰的对象在释放之后,指针地址会被置为nil。

_block是用来修饰一个变量,这个变量就可以在block中被修改。

_block:使用_block修饰的变量在block代码块中会被retain(ARC下,MRC下不会retain)

_weak:使用_weak修饰的变量不会在block代码块中被retain

你要进行的面试问题还很多,可以咨询3163194867


加油,改变,学习,选择,从此刻做起,生活就是从身边的点点滴滴开始的

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“iosarc如何释放内存”边界阅读