2011-08-05 21 views
3

說我有下面的函數返回一個CLLocationCoordinate2D,這僅僅是一個struct有兩個double S(命名爲longitudelatitude)在其:Objective-C中的返回結構究竟如何工作?

- (CLLocationCoordinate2D)getCoordinateForHouse:(House *)house 
{ 
    CLLocationCoordinate2D coordToReturn; 
    coordToReturn.latitude = // get house's latitude somehow 
    coordToReturn.longitude = // get house's longitude somehow 

    return coordToReturn; 
} 

可我基本上把這個struct就像任何其他的原始類型?舉例來說,如果我在代碼中其他地方像這樣調用上面的函數:

CLLocationCoordinate2D houseCoord = 
     [someClassThatTheAboveFunctionIsDefinedIn getCoordinatesForHouse:myHouse]; 

被簡單地複製到houseCoord(就像任何其他原始將採取行動),這是從函數的返回值,對不對?我不必擔心CLLocationCoordinate2D有沒有在別處被銷燬?

現在看來很明顯,我認爲這可能是這樣,但我只需要確認。

回答

5

這是Objective-C的直接被C繼承了其行爲的一個區域 - 分配結構導致淺表副本。所以如果你在結構中有指針,那麼你將複製指針,而不是指向的東西。在C代碼中,您需要將其納入有關所有權的特殊規則中。在Objective-C中,自動引用計數編譯器不能處理結構體(或者我認爲是工會)內對象的引用,所以在任何情況下都不要過分依賴這個想法。

1

你是對的。如果您瀏覽文檔,您將看到:

typedef double CLLocationDegrees; 

typedef struct { 
    CLLocationDegrees latitude; 
    CLLocationDegrees longitude; 
} CLLocationCoordinate2D;
+0

是的,我之前看到過,我想我的問題更多地是關於結構如何工作。他們是否可以像原始人一樣對待(當然除了能夠點他們並獲得不同的領域)。 – Tim

+0

是的,結構值應該像原語一樣對待。在某些情況下,您可能需要使用malloc和free來執行手動內存管理,但在這種情況下,您將有一個指向此結構的指針,在這裏不是這種情況。 – titaniumdecoy

+0

好酷,謝謝。一個快速跟進:結構可以有指針嗎?指針是原始的,還是它們?指針指向的是指它是否被認爲是一個原語,這有什麼關係嗎? – Tim

1

是的,這就是您如何處理返回結構。當你使用一個返回結構的方法時,編譯器會修改它,以便它實際返回void,並添加一個新的第一個參數,該參數是指向應該存儲結果的結構的指針。所以,您的方法編譯得更像這樣的:

- (void):(CLLocationCoordinate2D*)returnValue getCoordinateForHouse:(House *)house 
{ 
    CLLocationCoordinate2D coordToReturn; 
    coordToReturn.latitude = // get house's latitude somehow 
    coordToReturn.longitude = // get house's longitude somehow 

    returnValue->latitude = coordToReturn.latitude; 
    returnValue->longitude = coordToReturn.longitude; 
} 
+1

該方法名稱完全有效。方法名稱中的標籤可以是空字符串。 –

+1

@ughoavgfhw:我不質疑你的斷言,Objective-C編譯方法將結構返回到將結構指針參數引用的方法,但是你有源代碼嗎?我沒有意識到這種行爲,並有興趣閱讀更多關於它的信息。 – titaniumdecoy

+1

見objc_msgSend_stret()文檔:http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/objc_msgSend_stret。你可以看到它的第一個參數是一個指向一個足夠大的內存塊的指針,以包含要返回的結構體。運行時傳遞returnValue的地址。 –