2010-04-19 9 views
0

내가 이렇게 내 헤더 파일에 구조체를 선언했습니다구조체를 할당 해제 할 수 있습니까?

typedef struct { 
NSString *department; 
NSString *departmentId; 
} Department; 

Department currentDepartment; 

이 구조체는 매우 간단한 클래스입니다. 구조체 값을 viewDidLoad에 할당합니다. viewDidLoad를 떠나기 직전에 구조체 값이 여전히있는 것을 볼 수 있습니다. 사용자가 세그먼트 컨트롤을 클릭하면 구조체 값을 다시 할당합니다. 값을 할당하기 전에 두 구조체 값이 0x0임을 확인합니다. 나는 밖으로 인쇄하는 NSZombieEnabled을해야합니까이 I 구조체 위에 마우스를 응용 프로그램이 실행되는 동안 내 중단 점 중 하나는 명중되었을 때 :

MyApp[25722:207] *** -[CFString _cfTypeID]: message sent to deallocated instance 0xfc0e90 

내가 구조체의 인스턴스를 생성하거나 할당 해제 아니에요 . 어떻게 할당 해제 될 수 있습니까?

답변

1

가능하다면 객체를 구조체에 넣지 말 것을 강력히 권장합니다. Structs는 데이터의 벙어리 모음이며 접근 자의 객체 캔처럼 멤버의 메모리를 관리 할 수 ​​없습니다. 이는 클라이언트 코드가 구조체 멤버를 처리하고 해제 할 때 책임을 져야하며 엄격한 변경이 이루어지기 전에 구조체 멤버가 릴리스되는지 확인해야합니다. 실제로 그렇게 쉽지는 않습니다. 가벼운 객체를 만드는 것이 더 낫습니다.

+0

저는 동의어가 가벼운 클래스보다 구조체가 더 유용한 경우가 있습니다. 그 트릭은 그 드문 경우를 확인하는 것입니다 :) – rpetrich

+0

@rpetrich : 개체가있는 구조체에 대해 이야기하는 경우,이 사례는 너무 드문 것처럼 보입니다. 안전하지 않은 고토에 대해 좋은 사례가 될 가능성이 더 많습니다. – Chuck

+0

객체의 구조체는 iPhone OS의 키보드 및 자동 수정 기능의 내부 표현에 자주 사용됩니다 (예 : – rpetrich

1

아니요, 구조체를 해제 할 수는 있지만 코드에서 어딘가에 있지 않으면 구조체를 해제 할 수 없습니다. 이 경우 할당 취소되는 것은 오류 메시지에서 볼 수있는 것처럼 문자열입니다. departmentdepartmentId 멤버를 설정할 때 사용중인 개체를 확인하십시오.

실제로 구조체 멤버에 객체를 할당 할 때 일반적으로 메모리 관리에주의해야합니다. 이 경우 -retain 메시지를 문자열에 보내거나 stringWith... 또는 다른 방법 대신 alloc/init... 또는 copy을 사용하도록 문자를 만드는 방법을 변경해야 할 수 있습니다.

+0

설명 : Structs (유형 의미)는 해제 할 수 없으며 메모리 덩어리가 해제 될 수 있습니다. 구조체 타입의 변수를 결코 전달하지 않고 오직 포인터 만 전달할 것입니다. – Chuck

+0

구조체는 malloc(), calloc() 등으로 동적으로 할당 할 수 있습니다. 구조체가이 방법으로 할당되면 해제 될 수 있습니다. 구조체 타입의 변수를 * 정의하는 것과 혼동 스러울 것 같습니다. 물론, 동적으로 할당 된 것의 주소는 어떤 포인터 타입의 변수에 저장되어야합니다. – jlehr

관련 문제