2009-11-13 3 views
2

나는 Objective-C 세계에 대해 아주 새롭고 오랜 역사를 가지고 있습니다 .net/C# 그래서 자연스럽게 C#을 사용하려고합니다.NSArray의, 기본 유형 및 권투 오 마이!

지금 여기에 질문 : 나는 객체 (즉의 NSNumber)에 기본 유형을 포장의 전체 개념을 좋아하지 않기 때문에 기본 형식을 유지하기 간단한 목표 - C 모음의 몇 가지 유형을 만들 정말 경사 느낌 NSArray와 같은 컬렉션에 추가합니다.

사실 NSArray가 객체에서만 작동한다는 것을 완전히 이해하고 있습니다. 그러나 그것은 단지 저에게 정말로 바보입니다. 박스형 프리미티브로 작업해야만합니다. 예를 들어 기본 Integer에서 작동하는 컬렉션이 없기 때문입니다.

그래서 C# 친구들은 내가 옛날에 .net을 사용하여 이야기 한 내용을 알게 될 것입니다. 일반적으로 generics가 아직없는 경우 간단한 배열이나 ArrayList를 사용합니다. ArrayList는 본질적으로 기본 유형을 상자에 넣도록 강요하지만 사실은 장면 뒤에서 실제로했기 때문에 성과 측면에서 비용을 지불했습니다.

성능 비용을 처리 할 수 ​​없다면 자신 만의 커스텀 콜렉션을 만들거나 결국 제네릭을 사용하게되었습니다.

Objective-C 세계에서 우리는이 문제를 다시 처리해야하지만, 개발자가 정말로 신경 쓰지 않는 것과 같거나 중요하지 않습니다.

제 질문은 다음과 같습니다. 권장 연습은 무엇입니까? 예를 들어 NSInteger를 보유하기 위해 내 자신의 사용자 지정 Objective-C 모음을 빌드해야합니까? 또는 동료 코더로 네이티브 C 배열을 사용해야합니다. 메모는이 블로그 게시물에서 제안합니다. NSArray vs. C Array performance

아니면 Apple의 기본 제공 컬렉션을 사용하고 글 머리 기호를 물리지 만합니까? 퍼포먼스가 중요한 앱을 제작할 때 메모가 설명하는 성능 특성을 고려해 볼 가치가 있음을 알 수 있습니다.

이 게시물은 입이 였지만 가슴에서 꺼내야했습니다.

+0

언어/프레임 워크에 대한 버그 또는 성능에 영향을주는 특정 사례가 있습니까? – sbooth

답변

2

개인적으로는 객관적인 C++ 및 std :: vector <>을 사용하는 것이 좋습니다. 네이티브 객관적인 C 컨테이너를 사용해야 할 필요가 없다면, 어떤 이유로 객체를 사용해야 할지도 모릅니다.

0

NSIntegers 만 보유하려는 경우 일반 C 배열을 사용할 수 있습니까?

편집 : 성능상의 이유로이 작업을 수행하는 경우 나에게 너무 조숙 한 최적화라고 생각됩니다.

+0

단순한 응용 프로그램을 만드는 경우 NavigationController와 일부 UIView ... 그렇다면 너무 조기에 최적화 된 것일 수 있습니다. 그러나 실제로 이러한 마이크로 최적화에 관심이있는 그래픽 기반 작업을 수행하는 경우 중요합니다. 이런 식으로 내려 오면, 당신이 그것을 얻을 수있는 곳으로 가져 가십시오. –

+0

좋은 지적. 나는 아마 내 뇌가 다른 것들로 가득차있을 때 대답을하지 말아야한다. ;) – Wevah

0

내가 해결하려고하는 문제에 대한 더 나은 솔루션이 항상 존재하기 때문에 필자는 정수의 동적 배열을 실제로 필요로하지 못했습니다. 예를 들어, NSData는 바이트 배열을 저장할 수 있습니다. 또는 원하는 정수 세트 인 경우 NSIndexSet을 사용할 수 있습니다.

또한 CFArrayCreate를 사용하고 적절한 콜백 함수를 전달할 수 있습니다. 원할 경우 Objective-C로 래핑 할 수도 있습니다.

해결하려는 특정 문제가 있습니까?

0

malloc을 통해 'C'배열 방식을 사용하려면 배열 소유자의 수명주기를 고려해야합니다. 기타 고려 사항 ARC 및 어레이 크기 조정 등은 '랩핑'방식을 매력적으로 만듭니다. 'C 스타일'에서 볼 수있는 유일한 이유는 프로젝트가 포트이거나 프로파일 러 결과를 기반으로하는 경우입니다.'랩'하기로 결정한 경우 NSArray+Primitive과 같은 접근 방식을 고려해 NSArray 및 NSMutableArray에 프리미티브 유형 기능을 추가하는 범주를 만듭니다.