2012-07-27 23 views
2

我想了解塊的基本原理。我寫了這個簡單的測試:爲什麼這個基本的Objective C塊代碼不起作用?

NSString *(^print_block)() =^(NSString *returned_string){ 
    return @"this block worked!"; 
}; 

NSLog(@"%@", print_block); 

我預期的控制檯輸出"this block worked!",而是我得到錯誤號的大洪水等,,結尾:

terminate called throwing an exception 

怎麼了?

編輯:答案已建議使用:

​​

但是,這並不工作。程序在塊定義的開始處終止,控制檯僅說明(lldb),Xcode在塊定義處放一點綠色箭頭。箭頭寫着:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x5f646e71)

我試過別的東西不工作:

NSString *(^print_block)() =^(NSString *returned_string){ 
    NSString *return_me = @"this block worked!"; 
    return return_me; 
}; 

NSLog(@"%@", print_block); 

但至少這不會終止程序。它運行良好。但是控制檯輸出仍然是錯誤的:

<__NSGlobalBlock__: 0x5a58>

+1

嘗試的NSLog(@ 「%@」,print_block()); – Vatev 2012-07-27 16:21:32

+0

不起作用。儘管如此,我沒有收到大量的錯誤信息,這看起來像是進步。但是代碼不會執行而終止。或者,我試過:'NSString *(^ print_block)()= ^(NSString * returned_string){NSString * return_me = @「this block worked!」;' 'return return_me; ' '};' '' 'NSLog(@「%@」,print_block);'現在,這並沒有給我任何錯誤,但它仍然無法正確工作。控制檯輸出應該是'this block working!',但是它是'<__ NSGlobalBlock__:0x5a58>'。 – 2012-07-27 16:25:50

+0

格式化的抱歉,我不能讓這個迷你Markdown的東西正常工作,儘管我認爲我正在做它所說的。我在所有的代碼部分放了',但只有最後的代碼格式正確。我不能爲了我的生活換一個新的路線。幫助說在一行中添加兩個空格來創建一個新行。兩個空間似乎什麼都不做。無論如何,對不起。 – 2012-07-27 16:33:21

回答

2

Vatev的評論是正確的。當你寫:

NSLog(@"%@", print_block); 

你傳遞塊print_block作爲在日誌語句格式字符串參數。您正在嘗試打印該塊。這可能導致[print_block description]被調用。我不知道塊是否實現了-description方法,但如果不是,那麼您將得到無法識別的選擇器異常。

此外,您聲明塊的方式不正確。您不需要在參數列表中包含返回值。

下面的代碼工作像您期望:

NSString *(^print_block)() = ^{ 
    return @"this block worked!"; 
}; 

NSLog(@"%@", print_block()); 
+0

我會將我對Vatev的回覆剪下來並粘貼:\t 不起作用。儘管如此,我沒有收到大量的錯誤信息,這看起來像是進步。但是代碼不會執行而終止。或者,我試過:'NSString *(^ print_block)()= ^(NSString * returned_string){'NSString * return_me = @「this block worked!」;''return return_me; ''};''''NSLog(@「%@」,print_block);'現在,這並沒有給我任何錯誤,但它仍然無法正確工作。控制檯輸出應該是'this block working!',但是它是'<__ NSGlobalBlock__:0x5a58>'。 – 2012-07-27 16:34:26

+0

我會剪切並粘貼關於格式的道歉:\t 格式化的抱歉,我無法讓這個迷你Markdown的東西正常工作,儘管我認爲我正在做它所說的。我在所有的代碼部分放了',但只有最後的代碼格式正確。我不能爲了我的生活換一個新的路線。幫助說在一行中添加兩個空格來創建一個新行。兩個空間似乎什麼都不做。無論如何,再次抱歉。 – 2012-07-27 16:35:42

+0

它沒有按照你編寫它的方式工作,因爲你已經指定該塊使用一個名爲'return_string'的參數。查看我編輯的代碼是否正確。 – Caleb 2012-07-27 16:46:24

相關問題