2010-04-02 2 views
7

제목, 키, 아티스트 등의 속성을 가진 노래가 있습니다. 방법이 없습니다. 나는 노래 정보의 데이터베이스를 통해 반복하고 각각에 대해 Song 객체를 만들고 속성을 채운 다음 Song 객체를 NSArray에 저장합니다.목표 C 클래스 또는 구조체?

그럼 왜 클래스 Song이 아닌 동일한 속성을 가진 구조체 Song을 가지고있는 것일까? 이렇게하면 클래스 파일, using 클래스의 .m 파일에있는 #import Song 행 및 alloc, init, release의 필요성이 제거됩니다.

반면에 필자는 필요할 수있는 모든 클래스에 구조체 정의를 넣어야합니다. (거기에 일부 전역 적으로 액세스 할 수있는 위치가 없다면?) 또한, 구조체 NSArray에 저장할 수 있습니까?

답변

18

수업과 함께 할 것입니다. 구조체는 NSArray (또는 그와 관련된 다른 컨테이너 클래스 중 하나)에 저장할 수 없습니다. NSValue에 랩핑하지 않는 한 구조체를 수행 할 수는 있지만 약간의 문제가 있습니다.

또한 지적했듯이 어딘가에 구조체를 정의해야합니다. 일반적인 방법은 클래스와 마찬가지로 헤더 (.h) 파일에 정의하는 것입니다. 그래서 구조체로부터 '이득'이 없습니다.

+0

위대한, 지금 나는 알고있다. –

+1

구조체는 NSValue가없는 NSPointerArray에 매우 효율적으로 저장할 수 있습니다 (다양한 함수를 사용하여 구조체를 설명해야 함). 그러나 ARC에서 구조체는 더 이상 NSString과 같은 객체를 포함 할 수 없습니다. char 제목과 같은 것을 캐스트해야하므로 struct가 훨씬 덜 유용합니다. 그래서 저는 수업으로 바뀝니다. –

2

두 가지 방법이 있지만 문제를 구분하지 않고 자체 클래스 파일에 보관하는 것이 좋습니다. 또한, SOLID의 Single Responsibility Principle에 더 가깝습니다. 메인 클래스 파일을 변경해야하는 이유는 무엇입니까? 그것을 분해하십시오.

+0

감사합니다. 좋은 지적입니다. –

6

구조체를 NSArray에 저장할 수 없습니다 (메서드의 서명을 살펴보십시오. 모든 메서드가 객체를 가져오고 반환합니다). 그러나 그 외에도 another recent question에 대한 대답에서 말했듯이 객체를 구조체에 넣는 것은 항상 나쁜 생각입니다. 객체는 유지되고 해제되어야하며 구조체에는 적절한시기에 발생하도록 보장하기 위해 관련 코드가 없습니다. 이것은 모델 객체로서보다 의미가 있습니다.

+0

감사합니다. 좋은 지적입니다. –