问题1: 描述下属性关键字
原子性:
-
原子性(atomic)
默认 非原子性(nonatomic)
详细可以参考这个 IOS面试题(类相关) --- atomic与nonatomic
读写权限:
readonly
-
readwrite
默认
引用计数:
-
retain
: 通常MRC下使用, 对象引用计数会+1; -
strong
: 强引用, 只可以修饰对象,属性的默认修饰符。对属性赋值时,会对对象retain,并且引用计数会+1. -
weak
: 弱引用, 对属性赋值的时候不会对对象retain,引用计数也不会+1,并且当所引用的对象为nil
时,该属性也就变为nil
-
assign
: 修饰对象和基本数据类型, 如 int, BOOL类型-
修饰对象,其修饰的对象引用计数不增加,可以避免循环引用,但assign修饰的对象释放后,指针不会被系统置为nil,这会产生野指针的问题,此时向对象发送消息会奔溃。
-
修饰基础数据类型(常用) 例如: int , float, NSInteger, CGFloat ,因为基本数据类型放在栈区,先进先出,基本数据类型出栈后,assign修饰的变量就不存在了,不用担心指针的问题。
-
-
copy
: 引用 / 修饰不可变的对象,例如: NSString, NSArray, NSDictionary。copy和strong类似,不同之处在于,copy修饰的对象会先在内存中拷贝一个新的对象,copy会指向那个新的对象的内存地址,这样避免了多个指针指向同一对象,而导致的其中一个指针改变了对象,其他指针指向的对象跟着改变。
详细例子见: IOS底层(十一): 属性修饰分析
问题2: 看下面例子返回是什么
@interface ViewController ()
@property (nonatomic, copy) NSMutableArray *array;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.array = [NSMutableArray arrayWithArray:@[@"1", @"2", @"3"]];
[self.array addObject:@"4"];
NSLog(@"结果测试: %@", self.array);
}
主要考察copy修饰对象以及深拷贝浅拷贝问题

copy方法返回的都是不可变对象
那么上面问题, copy修饰可变对象NSArray, 进行浅拷贝, 目标对象变成不可变类型, 不可变类型没有插入方法, 那么会报插入方法找不到 crash

问题3: 浅拷贝和深拷贝区别
-
浅拷贝
: 对内存地址复制, 让目标对象指针和源对象指向同一片内存空间- 增加对象引用计数
- 不会发生新内存分配
-
深拷贝
: 让目标对象指针和源对象指针, 指向2片内容相同的内存空间- 不增加对象引用计数
- 产生新的内存分配 2片的内存空间内容相同, 但不是同一个
网友评论