面试题 -- OC基础知识

文章目录

  • 1. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?
  • 2. 属性关键字assign、retain、weak、copy
  • 3. strong和weak关键字有什么区别
  • 4. 什么情况下使用weak关键字?相比于assign有什么不同?
  • 5. atomic(原子性)和nonatomic(非原子性)区别

1. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

#import是Objective-C导入头文件的关键字,
#include是C/C++导入头文件的关键字,
使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;
@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含、循环引用问题;
#import<>用来包含系统的头文件,#import””用来包含用户头文件。
 

2. 属性关键字assign、retain、weak、copy

assign:用于基本数据类型和结构体。如果修饰对象的话,当销毁时,属性值不会自动置nil,可能造成野指针。
weak:用来修饰OC对象。对象引用计数为0时,属性值也会自动置nil
retain:强引用类型,ARC下相当于strong,但block不能用retain修饰,因为等同于assign不安全。
strong:强引用类型,修饰block时相当于copy。

copy

  1. block 是在栈区分配内存,由系统管理,使用copy拷贝到堆区 避免被释放
  2. NSString NSArray NSDictionary 存在对应的可变类型
    可变字符串 copy -> 不可变字符串

3. strong和weak关键字有什么区别

  1. 针对于对象的
  2. strong是强指针,持有对象的所有权
  3. weak是弱指针,不持有对象所有权

4. 什么情况下使用weak关键字?相比于assign有什么不同?

  1. 委托 为了规避循环引用,使用weak限定delegate 指针
  2. StoryBoard Xib 拖拽控件,可以使用weak关键字限定属性

与assign的区别

  1. weak只能修饰对象指针,assign可以修饰任意类型的指针
  2. weak指针指向的对象如果被释放,weak指针自动置为nil,assgin不会自动置为nil

基本数据类型用weak来修饰
Xcode会直接提示错误,信息如下

Property with 'weak' attribute must be of object type

对象使用assign来修饰
编译没有问题,运行也没有问题。
weak修饰的对象,当对象释放后,即引用计数为0时,对象会置为nil
复制代码而向nil发送消息是没有问题的,不会崩溃。
assign修饰的对象,当对象释放之后,即引用计数为0时,对象会变为野指针,不知道指向哪,再向对象发消息,非常容易崩溃。
 

5. atomic(原子性)和nonatomic(非原子性)区别

(1) atomic:提供线程安全,是防止在写未完成的时候被另一个线程读取,造成数据错误(即阻止两个线程同时更新一个值)。
(2) non-atomic:在自己管理的内存环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单的返回这个值。

你可能感兴趣的:(面试题,OC)