IOS面试题(类相关) --- 属性关键字

问题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方法返回的都是不可变对象

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

问题2答案


问题3: 浅拷贝和深拷贝区别

  • 浅拷贝: 对内存地址复制, 让目标对象指针和源对象指向同一片内存空间

    • 增加对象引用计数
    • 不会发生新内存分配
  • 深拷贝: 让目标对象指针和源对象指针, 指向2片内容相同的内存空间

    • 不增加对象引用计数
    • 产生新的内存分配 2片的内存空间内容相同, 但不是同一个


你可能感兴趣的:(IOS面试题(类相关) --- 属性关键字)