2011-11-19 5 views
0

, 난 등 오브젝트의 배열을 관리 할 수있는 개체 오브젝트 유형 "을 참조하십시오.엑스 코드 4 (C)의 배열은 엑스 코드 3 컴파일러와

가장 좋은 방법은 NSArray로 변환하는 것이지만 C 스타일 배열 첨자 (예 : self.layer [i])를 사용하는 100 줄의 코드가 있다고 생각합니다. 고칠 수있는 다른 방법이 있습니까?

+0

좋아요, 기본 컴파일러를 LLVM에서 LLVM gcc로 변경하는 빠른 답변을 찾았습니다. 4.2. 하지만 LLVM을 사용하여이 작업을 수행 할 수있는 방법이 있는지 알고 싶습니다. – user1055568

+1

배열을 수정할 때 (자동 참조 계산을 사용할 수 없기 때문에 생기는 여분의 모든 것들을) 유지/해제하는 것을 잊어 버림으로 인한 메모리 누수 및 임의의 충돌을 추적하는 것은 아마도 이걸 고쳐라. –

답변

1

assign 속성으로 변경하여 개체가 아닌 것을 유지하려고하지 않습니까?

+0

예, 그게 내가하고있는 일입니다. 나는 컴파일러가 불평하지 않았지만 gcc에서 retain 속성이 작동하지 않았기 때문에 수동 유지/릴리스를 이미 수행하고 있습니다. – user1055568

0

C 배열에서 Objective-C 메모리 관리 호출 (예 : retain)을 사용할 수 없습니다. 표준 C 또는 C++ 로직을 사용하여 어레이를 관리해야합니다. 스스로 malloc하고 메모리를 비울 필요가 있습니다. 배열을 유지할 필요가 없다면 retain 속성을 제거 할 수 있습니다. 이 코드

+1

선언 된 것처럼, ivar 자체에는 메모리 관리가 필요하지 않지만. ivar에 대한 메모리는 오브젝트 내에 인라인으로 저장됩니다. 'malloc'이나'free'는 필요 없습니다. – bbum

2

몇 가지 문제 :

  • 그것은 MyView하지 myView해야한다; 클래스는 대문자로 시작합니다.

  • CALayer **아니요 개체 유형입니다. 이것은 객체 유형에 대한 포인터이므로 컴파일러가 불만을 제기합니다. 단순히 할당하면 컴파일이되지만 여전히 잘못 될 것입니다.

  • 이 데이터를 저장하기 위해 언어 배열 (MyClass foo[4])을 사용할 이유가 없습니다. 독립 실행에서 "이 슬롯이 채워지지"에 대한로 [NSNull null]을 사용할 수 있습니다 (AN있는 NSMutableArray를 사용합니다.

당신이 정말 언어 배열을 고수 할 경우, retain 놓습니다. 그냥 기억 어레이 내에서 객체의 유지/해제를 명시 적으로 관리해야합니다.

또한 일반적인 표준 패턴으로 인라인되도록 코드를 수정하는 것이 어려울 수도 있지만 코드가 발전하면서 더 많은 비용이 드는 것입니다. 언젠가는 정말로 그렇게해야 할 상황에 처할 것입니다.

+0

나는 왜/원래 코드가 gcc에서 작동하는지 알고 싶다. 어떤 생각이든? – hooleyhoop

+0

코드가 GCC에서 작동하지 않았습니다. GCC는 오류를 잡으려고 너무 바보 같았습니다. GCC 4.2에서'@ property'를 사용하는 것은 악몽이었고 엄청난 양의 엔지니어링 노력 없이는 잡을 수없는 몇 가지 오류가있었습니다. – bbum

+0

아, 그 이유는 내가 보유/출시의 행동을 그렇게 당황스럽게 생각한 이유입니다. 그것은 심지어 효과가 없었기 때문입니다! 나는 부적절하게 같은 것을하고있는 코드에서 외삽 법으로 외삽 법을 외삽했다는 것을 추측한다. 하지만 원칙적으로 제가 원하는 것을 할 수있는 방법이없는 이유는 아닙니다. 분명히, 나는 별개의 객체 인 * layer0, * layer1, * layer2, * layer3을 선언 할 수 있었고, 내가 원하는대로 작동하도록 만들 수 있었다. 그래서, 왜 레이어 * [0], * 레이어 [1], * 레이어 [2], * 레이어 [3]? 사실, 그게 잘 작동, 그냥 보존/릴리스를 합성하지 않습니다, 괜찮아요, 지금은 이해가 같아요. – user1055568