2011-11-02 84 views
17
  1. 如果我聲明屬性強,像這樣:ARC是否具有強大屬性所必需的self.iVar?

    @property (strong, nonatomic) UIView *iVar; 
    

    當我設置它,它,如果我做iVar = ...self.iVar = ...重要?看起來,與ARC,他們做同樣的事情。

  2. 如果我只聲明實例變量(不是@property),例如,BOOL selected,這是否意味着它的推斷是__unsafe_unretained(因爲沒有財產指定它是強大的),或者我必須明確指定?

好像我可以回答ARC: How to release static variable?已經回答了上面我自己的問題,但我仍然對上述問題略顯迷茫。

回答

20

從存儲管理的角度來看,使用ivar = ...self.property = ...(注:有沒有這樣的東西作爲self.ivar)是相同的。但是,使用ivar = ...不會調用setter,而self.property = ...會。這有3點重要的影響,在沒有特定的順序:

  1. 如果屬性沒有標記nonatomic,然後訪問底層的伊娃不會採取鎖,你會被打破原子的影響。
  2. 如果該屬性被覆蓋,無論是由您還是由一個子類覆蓋,重寫的setter將不會被調用。
  3. KVO通知將不會發送。

至於只聲明伊娃,它具有與聲明局部變量相同的內存管理語義。這被記錄在section 4.4 of the Objective-C Automatic Reference Counting文檔中,但基本上,如果它是一個對象,則它將被推斷爲__strong

+0

@kaka:不。不管ARC/MRR如何,簡單的反例:分配大於單個單詞的結構幾乎肯定不是原子的。 –