美文网首页
iOS面试基础知识点(一) 内存相关

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

作者: 风车过也 | 来源:发表于2019-10-09 15:38 被阅读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而言,速度更快,线程也是不安全的。

    相关文章

      网友评论

          本文标题:iOS面试基础知识点(一) 内存相关

          本文链接:https://www.haomeiwen.com/subject/qqmwpctx.html