2011-03-22 2 views
3

나는 약간 MapKit에서 클래스 MKMultiPoint의 다음 특성 points에 의해 잠기 게하고 반환 : 그것은 구조체의 배열을 반환는 C-배열 및 메모리 관리

@property (nonatomic, readonly) MKMapPoint *points 

합니다. pointCount 속성을 사용하여 배열의 요소 수를 알 수 있습니다.

C에 대한 제한된 지식으로 인해 호출자가 메모리를 할당 한 다음 릴리스해야하기 때문에 C 배열이 함수에 대한 참조로 전달 된 경우에만 "반환 된 정렬"일 수 있다고 생각했습니다.

비슷한 속성을 쓰려면 누가 배열 (아마도 호출 수신자 일 수도 있음)에 누가 더 많은 메모리를 할당 할 것인가? 누가 더 많이 (아마도 호출자 일까?) 누가 해방하겠습니까? 그것은 나에게 조금 위험한 것처럼 들린다. 게다가, 위의 속성에 대한 문서는 메모리를 해제해야한다는 것에 대해서는 아무 것도 말하지 않습니다.

무엇이 누락 되었습니까?

답변

0

대부분의 경우 수신자는 메모리 할당을 처리합니다. 누가 그것을 확보할지는 소유권을 결정하는 방법에 달려 있습니다. 수신자가 할당 한 메모리가 반환되면 더 이상 필요하지 않은가요? 그렇다면 문서에서 호출자가 반환 된 배열을 해제해야한다는 점에 유의해야합니다. 수신자가 리턴 된 메모리를 재사용 할 수있는 경우, 할당 해제 된 상태로 두십시오.

당신이 메모리 할당을 처리하는 호출자에 그것을두고 싶었다면, 당신은 아마 속성을 사용하지 않을 대신 메시지에 대한 선택과 재산과 같이 :

- (NSUInteger) mapPointCount; 
- (void) getMapPoints:(MKMapPoint *)pointsOut; 

하면 보낸 사람이 제공해야하는 위치 obj.mapPointCount의 MKMapPoints를 저장하는 기존 버퍼. 그런 다음 호출자에게 할당/할당 해제에 대한 책임을 부여했습니다.

해당 경로로 이동하고 싶지 않으며 해당 메모리가 수신자에 의해 보존/해제/자동 해제되지 않을 수 있으므로 발신자에게 메모리를 해제하도록 요청합니다. 메모리를 해제 할 수 없다는 것을 분명히 밝히고 싶다면 const MKMapPoint *형식으로 반환하십시오. 어떤 형태로든 문서화되어 있습니다 (). 메모리에 액세스하는 사람이 메모리를 소유하지 않았 음을 분명히 밝혀야합니다. 데이터).

또는 NSData 또는 다른 항목에 저장하고 다음 자동 릴리즈 풀이 비면 포인터가 유효하지 않은지 확인하십시오. 그러나 이는 다소 덜 우호적이며 쓰레기 수거로는 안전하지 않을 수도 있습니다. 아마 그 마지막 비트에 대해서는 틀린 말이지 만, 나는 말할 충분한 것을 모른다. 그래서 나는 지금주의를 더 좋아할 것이다.

+0

안녕 @nil을, 감사, 특정 사례에서 문서의 중요성을 강조합니다. 나는'MKMultiPoint'의'points' 속성에 관한 Apple 문서에서 뭔가 빠졌다고 가정합니다. 메서드의 서명이 주어지면 호출자가 메모리를 해제하는 다른 옵션은 표시되지 않습니다. 그렇지 않으면, 그들은 누수가 될 것입니다, 그렇죠? – ptrico

+0

나는 모르겠다. 그러나 내 가정은 그것에 대한 노트가 없다면, 오브젝트가 포인터를 소유하고 할당 해제를 처리한다고 말할 수있다. 누설로 밝혀지면 나중에 해방 해 볼 수 있습니다. 누수가 아닌 것으로 가정하는 것이 더 낫습니다 (간단한 테스트를 통해 이걸 발견 할 수 있기 때문에). 잘 실행되고있는 것으로 보이는 글을 쓰면, 한달 후에 지옥은 당신이 의심하지 않는'자유로운 (...)'덕분에 느슨해집니다. – nil

+0

그리고 나는 이제이 질문에 대한 답을 완전히 썼다는 점을 깨닫는다. 아마 아무 도움이되지 않습니다. – nil

3

(샘플 코드는 C입니다.)

동일한 수준의 리소스를 할당하고 해제하는 것이 좋습니다.

// `points` are allocated and freed by the caller. 
void MakePoints (MKMapPoint *points, size_t number_of_points); 

// usage: 
size_t count = 10; 
MKMapPoint *points = malloc (sizeof (MKMapPoint) * 10); 
MakePoints (points, count); 

// Use points 

free (points); 

// or simply 
MKMapPoint points[10]; 
MakePoints (points, 10); 

// Use points 

두 번째 방법은 라이브러리 함수는 메모리를 관리 할 수 ​​있도록하는 것입니다 : 가지의 배열을 반환하는 함수를 정의하는 방법은 두 가지가 있습니다 당신의 대답을

MKMapPoint *MakePoints (size_t number_of_points); 
void FreePoints (MKMapPoint *points); 

// Usage: 
MKMapPoint *points = MakePoints (10); 

// Use points 

// The library need not necessarily call free() on points, 
// it might reuse it in further calls to MakePoints(). 
FreePoints (points); 
+0

안녕하세요 @ Vijay Mathew와 귀하의 답변에 감사드립니다. 네가 가진 2 가지 예를 이해하지만, 내가 준 것과 일치하지 않는 것처럼 보입니다. MKMultiPoint 속성에서 배열은 반환되고 인수는 전달되지 않습니다. 이는 points 속성의 경우처럼 호출자가 아닌 메모리를 할당하도록합니다. 두 번째 예제에서 문서는 반환 된 배열에 대해 "사용 가능한 메모리"함수를 언급하지 않습니다. 호출자가 free() C 함수를 사용하여 메모리를 해제해야한다는 것을 의미합니까? – ptrico