2011-08-05 7 views
3

두 개의 double (longitudelatitude)이있는 CLLocationCoordinate2DCLLocationCoordinate2D를 반환하는 다음 함수가 있다고 가정 해 보겠습니다.Objective-C에서 반환 구조체는 정확히 어떻게 작동합니까?

기본적으로 다른 기본 형식과 마찬가지로이 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를 사용하여 수동 메모리 관리를 수행해야 할 수도 있지만이 경우에는 그렇지 않은 struct에 대한 포인터를 갖게됩니다. – 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의 주소를 전달합니다. –

관련 문제