2013年6月16日 星期日

Block 的 Copy 與 Release

在上一篇的教學教到了 Block 的使用,
通常在一個 Method 中傳入一個 Block 後,
在這個 Method 結束之前使用的時候就與平常的使用一樣。

不過如果要將 Block 用一個全域變數保留下來的話,
就會出現問題了,因為,Block 的傳值時是 Auto Release 的狀態的,
所以需要避免被系統 Release 掉,需要動點手腳。

在一般的變數都是使用 Retain 與 Copy 來增加 Retain Count 避免被系統 Release,
但是在 Block 上就只有 Copy 可以使用而已
當然有增加 Retain Count 也就有減少的方法,就是使用 Release,
要怎麼 Copy 與 Release 的話,就看下面的範例吧。

// 建立一個 Block 的形態
typedef void (^TestBlock) (void);

@interface BlockDemo : NSObject
{
	// 宣告一個全域的 Block
	TestBlock _testBlock;
}

@implementation BlockDemo

- (void)inputABlockForCopy:(TestBlock)testBlock
{
	// 將傳入的 Block 做 Copy 的動作,以確保不會被 Auto Release
	_testBlock = [testBlock copy];
}

- (void)dealloc
{
	// 在 Class 被 Release 時也讓全域的 Block 也 Release 掉
	[_testBlock release];
	
	[super dealloc];
}
	


其實很簡單,不過我之前將 Block 當成一個 struct,
但是它其實是一個 Object,所以可以做 Copy 與 Release 的動作,
好了簡單的教學到此為止,
下次我打算教如何使用程式碼繪出一張 UIImage,
下次再見囉。