文章目录
- 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:
- block 是在栈区分配内存,由系统管理,使用copy拷贝到堆区 避免被释放
- NSString NSArray NSDictionary 存在对应的可变类型
可变字符串 copy -> 不可变字符串
3. strong和weak关键字有什么区别
- 针对于对象的
- strong是强指针,持有对象的所有权
- weak是弱指针,不持有对象所有权
4. 什么情况下使用weak关键字?相比于assign有什么不同?
- 委托 为了规避循环引用,使用weak限定delegate 指针
- StoryBoard Xib 拖拽控件,可以使用weak关键字限定属性
与assign的区别
- weak只能修饰对象指针,assign可以修饰任意类型的指针
- 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,那么访问器只是简单的返回这个值。