iOS面试合集

iOS property关键字详解

2020-06-19  本文已影响0人  小猪也浪漫

一、property关键字介绍

  • 1.1 原子性: atomic与nonatomic
  • 1.2 读写权限: readwrite与readonly
  • 1.3 内存管理语义: assign、retain、strong、copy、weak、unsafe_unretained
  • 1.4 方法名: getter、setter

1.1 原子性:atomic 与 nonatomic

问题:什么是原子性? 说明并比较atomic和nonatomic。 atomic是百分之百安全的吗?

原子性:并发编程中确保其操作具备整体性,系统其它部分无法观察到中间步骤,只能看到操作前后的结果。

//同步锁
- (NSString *)someString {
    @synchronized(self) {
        return _someString;
    }
}
- (void)setSomeString:(NSString *)someString {
    @synchronized(self) {
        _someString = someString;
    }
}
//并发队列
_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- (NSString *)someString {
    __block NSString *localSomeString;
    dispatch_sync(_queue, ^{
        localSomeString = _someString;
    });
    return localSomeString;
}
- (void)setSomeString:(NSString *)someString {
    dispatch_barrier_async(_queue, ^{
        _someString = someString;
    });
}

1.2 读写权限: readwrite与readonly

读写权限不写时默认为 readwrite 。一般可在 .h 里写成readonly,只对外提供读取,在 .m 的Extension中再设置为 readwrite 可进行写入。

//.h文件
#import @interface MyClass : NSObject

@property (nonatomic, readonly, copy) NSString *name;

@end


//.m文件
#import "MyClass.h"

@interface MyClass()

@property (nonatomic, readwrite, copy) NSString *name;

@end

1.3 内存管理语义: assign、strong、copy、weak、unsafe_unretained

1.3.1 关键字

  • assign:主要用于修饰基本数据类型,如NSIteger、CGFloat等,这些数值主要存在于栈中。
  • strong:表示指向并拥有该对象。其修饰的对象引用计数会 +1 ,该对象只要引用计数不为 0 就不会销毁,强行置空可以销毁它。一般用于修饰对象类型、字符串和集合类的可变版本。只能用于ARC环境。
    *retain:修饰对象类型,强引用对象,并是对象引用计数加1,可用于MRC环境中。
  • copy:与strong类似,设置方法会拷贝一份副本。一般用于修饰字符串和集合类的不可变版, block用copy修饰。
  • weak:表示指向但不拥有该对象。其修饰的对象引用计数不会增加,属性所指的对象遭到摧毁时属性值会清空。ARC环境下一般用于修饰可能会引起循环引用的对象,delegate用weak修饰,xib控件也用weak修饰。
  • unsafe_unretained:与weak类似,但是销毁时不自动清空,容易形成野指针。

1.3.2 比较 copy 与 strong

  • copy与strong:相同之处是用于修饰表示拥有关系的对象。不同之处是strong复制是多个指针指向同一个地址,而copy的复制是每次会在内存中复制一份对象,指针指向不同的地址。NSString、NSArray、NSDictionary等不可变对象用copy修饰,因为有可能传入一个可变的版本,此时能保证属性值不会受外界影响。
  • 注意:若用strong修饰NSArray,当数组接收一个可变数组,可变数组若发生变化,被修饰的属性数组也会发生变化,也就是说属性值容易被篡改;若用copy修饰NSMutableArray,当试图修改属性数组里的值时,程序会崩溃,因为数组被复制成了一个不可变的版本。

1.3.3 比较 assign、weak、unsafe_unretain

1.4 方法名: getter、setter

/.h文件
@interface MyClass : NSObject

@property (nonatomic, assign, getter=isOn) BOOL on;

@end

//.m文件
@implementation MyClass

- (BOOL)isOn {
    return self.on;
}

@end

二、参考文献

重识iOS之Property

上一篇 下一篇

猜你喜欢

热点阅读