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
相關文章
相關標籤/搜索