2012-04-09 73 views
7

考慮:複製性和Block_copy(myBlock)/ [myBlock副本]

typedef void (^select_block_t)(UIView *) ; 

(1) @property (copy, nonatomic) select_block_t  myBlockProperty ; 
(2) @property (strong, nonatomic) select_block_t  myBlockProperty ; 
(3) @property (assign, nonatomic) select_block_t  myBlockProperty ; 

和:

(A) self.myBlockProperty = ^(UIView *) {NSLog(@"Hi");} ; 
(B) self.myBlockProperty = [^(UIView *) {NSLog(@"Hi");} copy] ; 

我想了解什麼是要映射的財產申報正確的方法與塊複製語義

我已經在S.O.看到的例子here這將有利於[1:B]

但是後來我對'複製'操作的冗餘感到困惑。 我有限的理解是[1:A]應該是正確的,因爲我希望 塊在我分配屬性時被複制一次,而不是在創建塊時創建一次,然後再在屬性分配時創建。根據我的理由,[3:B]也是有意義的。那麼,我誤解了什麼?

回答

9

[1:A]是對的,是的。 [3:B]不正確,因爲:

  1. 目前還不清楚的是,類擁有的財產,所以應該釋放它的dealloc(但它應該)
  2. 二傳手(B)看起來像一個泄漏,並靜態分析器可能會這樣標記它,因爲該塊被複制,交給一個屬性,然後以保留計數+1離開該範圍。
  3. 使用(3)意味着它僅在您設置保留計數爲1的堆塊(複製塊)時纔有效。這在使用該屬性時留下了大量的錯誤餘量。 (1)與堆棧塊和堆塊一起工作,並且還將正確保留自動釋放塊。

編輯:我看到你正在使用ARC。在這種情況下,根本不可能使用[3:B]。一旦超出範圍,編譯器將釋放一個對象(即使在copy),並且該屬性設置器不會保留它。因此,該屬性將包含一個錯誤的指針,這是一個等待發生的EXC_BAD_ACCESS。

+0

等一下,剛剛看到你的標籤_automatic-ref-counting_,你在用ARC嗎? – joerick 2012-04-09 17:45:39

+0

是的,我正在使用ARC。 – verec 2012-04-09 19:11:39

+0

@verec我已經更新了我的答案。如果您有任何問題,請告訴我,我不確定我一直很清楚! – joerick 2012-04-09 22:46:55