iOS面试基础知识点(一) 内存相关

2019-10-09  本文已影响0人  风车过也

什么是ARC?

ARC即Automatic Reference Counting,它是现有的Objective-C的内存管理机制。该机制下,代码中会自动添加retain/release,原本需要手动处理引用计数的代码交由编译器自动完成。

什么是MRC?

MRC即Manual Reference Counting,手动通过retain为对象获取内存,并用release释放内存。

ARC与Garbage Collection的区别?

Garbage Collection在运行时管理内存,可以解决retain cycle,而ARC在编译时管理内存。

循环引用?

循环引用是指两个或两个以上对象相互之间互相强引用,导致所有对象无法被释放的现象。是内存泄漏的一种情况。实际使用中,最为常见的是block的应用。

关键词,引用类型?

strong:表示指向并拥有该对象。其修饰的对象的引用计数会+1.该对象只要引用计数不为0,就不会被销毁。可以通过强行设为nil进行销毁。

weak:表示指向但不拥有该对象。其修饰的对象引用计数不会增加,会自行在内存中被销毁。使用较多的是定义一个代理。

assign:主要用于修饰基本数据类型,如int、float,这些值主要存在于栈中。

copy:与strong类似。不同的是strong的复制是多个指针指向同一个地址,而copy的复制会在内存中复制一份对象,指针是指向不同的地址。fopy一般用在修饰有对应可变类型的不可变对象上,类似NSString

weak一般用于修饰对象,assign一般用来修饰基础数据类型。原因就是assign修饰的对象被释放后,指针的地址依然存在,造成“野指针”,在堆上容易造成奔溃。而栈上的内存系统会自动释放,不会造成“野指针”。

在Objective-C中,基本数据类型默认的关键字是atomic,readwrite和assign;普通属性的默认关键字是atomic,readwrite和strong。

atomatic和nonatomic的比较?

atomatic修饰的对象能保证setter和getter的完整性,任何线程访问它都可以得到一个完整的初始化的对象。但因为要保证操作的完成,所以速度较慢。比nonatomic安全,但也不是绝对的线程安全。

nonatomic修饰的对象不保证setter、getter的完整性,所以,当多个线程访问它的时候,他可能会返回一个未初始化的对象。所以,相较atomatic而言,速度更快,线程也是不安全的。

上一篇下一篇

猜你喜欢

热点阅读