2011-01-10 1 views
2

AudioBufferList * 유형의 구성원이있는 AudioManager 클래스가 있습니다. 이것은 CoreAudio 프레임 워크에서 선언 된 구조체입니다. AudioBufferListNSObject이 아니기 때문에 그것을 유지할 수 없으므로 할당/해제해야합니다 (잘못된 경우 수정하십시오).Objective-C 객체에서 malloc/free 사용

내 질문은 어디에서 무료로 '올바른'장소입니까? 현재 나는 의 dealloc 방법으로 작업하고 있습니다. 올바르게 이해하면 메시지가 AudioManager의 인스턴스로 보내지면이 메소드가 자동으로 호출됩니다. 사실입니까? Objective-C 오브젝트의 비 오브젝트 멤버에 alloc/free를 사용하는 것과 관련하여 권장되는 다른 방법이 있습니까?

편집 : 사과 문서에서

:

서브 클래스가 소비하는 추가 메모리 의 출시 할 수 있도록 할당 해제의 자신의 버전을 구현해야 객체를-같은 동적으로 할당 된 저장 데이터 또는 할당 된 오브젝트 이 소유하는 오브젝트 인스턴스 변수. 클래스 별 해제를 수행 후, 서브 클래스의 방법 슈퍼에 메시지를 통해 슈퍼 클래스 버전을 할당 해제의 을 포함한다 : 조금 더 명확한 것을 만드는

-하지만 더 통찰력이 평가됩니다.

답변

1

예, 당신은 /의 malloc에 ​​필요한 메모리를 해제 않습니다. 좋은 대답/예 여기 있습니다, 적절한 메모리 관리 포함 :

에 관해서는

iPhone: AudioBufferList init and release

"때"당신은 AudioManager가 해제 될 때 메모리를 해제 할뿐만 아니라 원하지만 것 또한 값이있는 경우 AudioBufferList의 내용이 변경되었습니다. 예 : 포인터가 AudioBufferList 구조체의 일부 "인스턴스 A"를 처음 참조하는 경우 AudioBufferList 구조체의 "인스턴스 B"를 가리 키도록 변경하면 "인스턴스 A"의 메모리를 확보 할 수 있습니다. 그렇지 않으면 분실 될 수 있습니다. (그리고 메모리는 유출 될 것이다.)

한 가지 중요한 점은 알고 있지만 실수로 잘못 입력 한 것일 수 있습니다. 은 release이 개체로 전송 될 때 호출되지 않습니다. NSObject의 인스턴스는 보유 카운트가 0에 도달 할 때만 할당이 해제됩니다. 개체의 보유 수는 일 수 있으며 [myObject release]을 보낸 후에 보유 수는 이됩니다. 그러나 이것은 dealloc 메시지를 이 아닌으로 전송할 것입니다. 이는 다른 일부 개체가 해당 인스턴스를 "소유"하고 할당 및 사용 가능 상태를 유지하기 위해 개체에 의존하고 있음을 의미하기 때문입니다.

+0

그래, 다른 주소를 가리 키도록 포인터를 할당하기 전에 하나를 자유롭게해야한다는 것을 분명히한다. ... 설명해 주셔서 감사합니다. –

0

malloc을 수행하거나 자유롭게 할 필요는 없습니다. CGRect 또는 AudioBufferList와 같은 구조체를 사용하는 것은 int 또는 double을 사용하는 것과 같은 방법입니다. non-object 유형에 대해서는 retain, alloc, dealloc, release 등 아무런 문제가 없습니다. 그것은 자동으로 release 메시지가 전송 될 때 호출 될 것이며, 자동적으로 카운트를 유지할 때 호출 될 AudioManagerdealloc 방법으로서

0이 1 개체로 유지할 수가 release 메시지 감소 전송 같음 그것은 여전히 ​​그것을 유지하는 다른 것들을 가질 수 있는데,이 경우 아직 할당 해제되지 않을 것이다. 애플이 구조체 유형을 사용하는 방법의

편집

예 :

CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 
{ 
    CGRect rect; 
    rect.origin.x = x; rect.origin.y = y; 
    rect.size.width = width; rect.size.height = height; 
    return rect; 
} 
+0

그러나 비 객체 유형 (예 :'AudioBufferList')은 여전히 ​​'c-style'malloc/free 일 필요가 있습니다. 때때로 동적으로 메모리를 할당해야합니다. (그리고 귀하의 의견의 두 번째 부분에 대한 감사). –

+0

명확하지 않은 AudioBufferList에 특별한 것이 없다면, 아니오. 예를 들어 Apple의 방법 인 CGRectMake를 보겠습니다.이 코드는 내 대답을 편집하여 게시합니다. – GendoIkari

+0

물론 데이터 유형의 복사본 만 반환하려는 경우. 하지만 실행 시간에만 알고있는 크기의'CGRect' 배열을 생성해야한다면 어떻게 될까요? 그런 다음, 내가 아는 한, 동적으로 메모리를 할당해야합니다. –