ios高效開發二--ARC跟block那點事

block是可以捕捉上下文的特殊代碼塊。block可以訪問定義在block外的變量,當在block中使用時,它就會爲其在作用域內的每個標量變量創建一個副本。如果通過self擁有一個block,然後又在block中改變了實例變量,就會出錯。例如:
1 self.block = ^(NSString *aString)2{3     self.aLabel.text = aString;4 });


這段代碼中,self保留了block,同時block又保留了self,會引發循環保留。很危險。如果未使用ARC,可以使用__block和__unsafe_unretained來複制一個未保留的引用副本。
 1//例如:(無ARC) 2 __block id safeSelf = self; 3 self.block = ^(NSString *aString) 4{ 5     safeSelf.aLabel.text = aString; 6}); 7 8//(有ARC) 9 __weak id safeSelf = self;        //ios 510// __unsafe_unretained id safeSelf = self; //ios 411 self.block = ^(NSString *aString)12{13     safeSelf.aLabel.text = aString;14 });
在arc出現之前,我們可以自由的把CF*對象轉成NS*對象,這稱爲自己橋接。用了arc之後,我們需要指定一個所有權轉移修飾符。目前arc中提供的修飾符有:1.__bridge2.__bridge_retained3.__bridge_transfer 第一個修飾符__bridge是一個普通的轉換,表示不需要增加引用計數,不更改所有權。第二個是在轉換C指針類型時,增加引用計數的值。第三個是把Core Foundation 指針類型轉換成obj-c指針,變把引用計數值+1。如用Core Foundation 方法創建一個對象,並且要用arc來管理對象的內存,就可以用這個。 arc移植的常見錯誤1.強制轉換obj-c指針位C指針(或者反過來轉換)2.在arc中把void*指針強制轉成id類型(或者反過來轉),如果要轉,就必須是用修飾符例如: id selfPointer = (__bridge void *)self;3.在結構體或者(union)集合體中是用obj-c對象4.使用NSAutoreleasePool


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章