2012-07-19 55 views
0

我對Objective-c非常陌生,並試圖更好地理解塊。作爲一個我自己的任務,我試圖用各種方法寫出嘶嘶聲。將int傳入函數,返回NSString

我目前正在使用塊,但我遇到了語法問題,我還沒有得到。

在下面的非工作函數中,我想傳入一個int並返回一個NSString類型。

NSString (^whichMessage)(int) = ^(int num) { 
    return @"Test"; 
}; 

但是我得到一個錯誤,指出:

Incompatible block pointer types initializing 'NSString (^_strong)(int)' with an expression of type 'NSString *(^)(int)' 

誰能解釋我的示例代碼是什麼問題,也是適當的形式是什麼?

我在這裏以下文件:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1

(爲了清楚起見,這裏是鏈接頁面上的示例代碼)

int multiplier = 7; 
int (^myBlock)(int) = ^(int num) { 
    return num * multiplier; 
}; 

在頁面的頂部由圖形去,我認爲通過將塊類型更改爲NSString,並將返回類型也變爲NSString,它就可以工作。但唉,事實並非如此。

回答

7

非常簡單。你的塊返回一個指向字符串而不是實際字符串的指針。我們總是與指針工作,對象不是實際對象本身

  | 
     v 
NSString *(^whichMessage)(int) = ^(int num) { 
    return @"Test"; 
}; 
+0

謝謝,我對此表示讚賞。你也可以解釋爲什麼使用的NSString時所需的指針聲明,但不是當返回類型是int像原來的例子蘋果文檔頁面上? – Geuis 2012-07-19 09:02:44

+1

的int是標量類型,其通常與基於堆棧存儲使用(不必須是)。對象(在Objective-C中)總是在堆上創建,然後傳遞對該對象的引用。 – 2012-07-19 09:08:30

+0

+1非常清晰的格式:) – 2012-07-19 09:11:43

1

你忘記了明星*

NSString* (^whichMessage)(int) = ^(int num) { 
    return @"Test"; 
}; 
3

你忘了*:

NSString* (^whichMessage)(int) = ^(int num) { 
    return @"Test"; 
}; 

的Objective-C只使用堆指針引用的對象。你不能像C++那樣聲明一個基於棧的Objective-C對象。

該規則值得注意的例外是塊,它充當Objective-C對象並可以基於堆棧。