美文网首页iOS进阶之路#iOS#HeminWon
iOS开发学习-关于属性修饰

iOS开发学习-关于属性修饰

作者: DreamMmMmM | 来源:发表于2016-08-31 20:49 被阅读599次

    1,什么情况使用 weak 关键字,相比 assign 有什么不同?

    什么情况使用 weak 关键字?

    在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性

    自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。

    不同点:

    weak此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。而assign的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

    assigin 可以用非 OC 对象,而 weak 必须用于 OC 对象。

    2,怎么用 copy 关键字?

    用途:

    NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;

    block 也经常使用 copy 关键字,

    block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy

    可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy

    也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy

    ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy

    操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。你也许会感觉我这种做法有些怪异,不需要写依然写。

    copy 此特质所表达的所属关系与 strong 类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。

    当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString

    类的实例。这个类是 NSString

    的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝

    一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的”

    (mutable),就应该在设置新属性值时拷贝一份。

    用@property声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

    3.@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?

    属性可以拥有的特质分为四类:

    原子性---nonatomic特质

    在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备 nonatomic

    特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(如果某属性不具备 nonatomic 特质,那它就是“原子的” (

    atomic) ),但是仍然可以在属性特质中写明这一点,编译器不会报错。若是自己定义存取方法,那么就应该遵从与属性特质相符的原子性。

    读/写权限---readwrite(读写)、readonly (只读)

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

    方法名---getter=、setter=

    getter=的样式:

    @property (nonatomic, getter=isOn)BOOLon;

    ( `setter=`这种不常用,也不推荐使用。故不在这里给出写法。)

    setter=一般用在特殊的情境下,比如:

    在数据反序列化、转模型的过程中,服务器返回的字段如果以init开头,所以你需要定义一个init开头的属性,但默认生成的setter与getter方法也会以init开头,而编译器会把所有以init开头的方法当成初始化方法,而初始化方法只能返回 self 类型,因此编译器会报错。

    这时你就可以使用下面的方式来避免编译器报错:

    @property(nonatomic, strong, getter=p_initBy, setter=setP_initBy:)NSString*initBy;

    另外也可以用关键字进行特殊说明,来避免编译器报错:

    @property(nonatomic, readwrite, copy, null_resettable)NSString*initBy;- (NSString*)initBy__attribute__((objc_method_family(none)));

    不常用的:nonnull,null_resettable,nullable

    4. @synthesize和@dynamic分别有什么作用?

    1.@property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;

    2.@synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。

    3.@dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到someVar = var时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

    5.用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

    1.因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.

    2.如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

    copy 此特质所表达的所属关系与 strong 类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。

    当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString

    类的实例。这个类是 NSString

    的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝

    一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的”

    (mutable),就应该在设置新属性值时拷贝一份。

    6.IBOutlet连出来的视图属性为什么可以被设置成weak?

    参考链接:Should-iboutlets-be-strong-or-weak-under-arc 

    文章告诉我们:

    因为既然有外链那么视图在xib或者storyboard中肯定存在,视图已经对它有一个强引用了。

    不过这个回答漏了个重要知识,使用storyboard(xib不行)创建的vc,会有一个叫

    _topLevelObjectsToKeepAliveFromStoryboard的私有数组强引用所有top

    level的对象,所以这时即便outlet声明成weak也没关系

    相关文章

      网友评论

        本文标题:iOS开发学习-关于属性修饰

        本文链接:https://www.haomeiwen.com/subject/ejhcettx.html