zoukankan      html  css  js  c++  java
  • strong、weak、unsafe_unretained(ARC);retain

    property with 'weak' attribute must be of object type:

    I have this in my interface:

    @property(nonatomic, weak)NSTimeInterval*timeStamp;
    Or:
    @property (nonatomic, weak) float height;

    Which my logic told me, I need a time stamp object, that only is going to be used by this class within the context of its instantiation, so "weak" seemed to be logical to me-- but XCode tells me "property with 'weak' attribute must be of object type"... If I just do:

    @property(nonatomic)NSTimeInterval*timeStamp;

    Then the error goes away, but I am not sure I understand why...

    The problem is that NSTimeInterval is a value type -- it's an alias for double, essentially (check NSDate.h for the typedef). The weak attribute only applies to objects that have a retain count (that is, anything that descends from NSObject or NSProxy).

    As such, storing a pointer to NSTimeInterval is probably a mistake on your part. You will most likely never receive a pointer to an NSTimeInterval unless you're expected to write to a given address as an output to a function (probably a callback in such a case). That said, I'm not aware of any functions with NSTimeInterval * as a return type nor any that pass the same to a callback.

    ----------------------------------------------------------------------------------------------------------------

    I'm still new to Objective-C and having some difficulties trying to figure out the appropriate way to use assign, retain, copy, strong, etc. when setting a property.

    For example, I have the following types declared - how should I be setting the properties?

    @property(nonatomic,??)NSMutableArray*myArray
    @property(nonatomic,??)NSString*myString
    @property(nonatomic,??)UIColor*myColor
    @property(nonatomic,??)int*myIn
    @property(nonatomic,??) BOOL *myBOOL

    Thanks....

    To reiterate, it does depend on context. In an non-ARC situation:

    @property(nonatomic, copy)NSMutableArray*myArray
    @property(nonatomic, copy)NSString*myString
    @property(nonatomic, retain)UIColor*myColor
    //Note the change to an int rather than a pointer to an int
    @property(nonatomic, assign)int myInt //Note the change to an int rather than a pointer to an int
    @property(nonatomic, assign) BOOL myBOOL

    The copy on myArray is to prevent modification by another "owner" of the object you set. In an ARC project, things change a bit:

    @property(nonatomic, copy)NSMutableArray*myArray
    @property(nonatomic, copy)NSString*myString
    @property(nonatomic, strong)UIColor*myColor
    //Note the change to an int rather than a pointer to an int
    @property(nonatomic, assign)int myInt //Note the change to an int rather than a pointer to an int
    @property(nonatomic, assign) BOOL myBOOL

    The change is primarily to myColor in your situation. You wouldn't use retain as you aren't managing reference counting directly. The strong keyword is a way of asserting "ownership" of the property and similar to retain. An additional keyword is also provided, weak, that would typically be used in place of assign for object types. Apple's common example of a weak property is for delegates. I'd recommend going through the Transitioning to ARC Release Notes in addition to the Memory Management Guide a time or two as there is more nuance than can easily be covered in an SO post.

    ----------------------------------------------------------------------------------------------------------------

    i'm a little confused about these two qualifiers... With ARC instead of use weak (i.e. if i need support iOS 4) i can use unsafe_unretained losing the auto-nil features... the final result seems to be similar to assign.

    • Can i exchange unsafe_unretained with assign ?
    • Are these qualifiers the same thing ?

    Clang's technical specification of ARC goes into much more detail about how the qualifiers work.

    But, to answer your question: assign and __unsafe_unretained are not the same thing. assignis a property attribute that tells the compiler how to synthesise the property's setter implementation, while __unsafe_unretained is an ownership(所有权) qualifier(限定符) that tells ARC how to insert retain/release calls. But they are related: when declaring a property, assign implies__unsafe_unretained ownership, and since assign is the default @property setter semantic, forgetting to include either doesn't change the code generated.

    http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

  • 相关阅读:
    C代码优化的一些方法
    读书笔记之:C++程序设计原理与实践(其他)[+++]
    读书笔记之:C++ Primer Plus(第5版)
    使用SoapFormatter 类序列化
    C# 多线程学习系列
    winform中读取嵌入的xml文件
    使用Web Service上(服务器端访问)
    jquery ajax调用webservice
    ashx文件和HttpHandler
    以Window服务作为wcf的寄主
  • 原文地址:https://www.cnblogs.com/mumue/p/3050015.html
Copyright © 2011-2022 走看看