2009-06-17 4 views
9

Objective C에서 인덱스에 관계없이 배열의 첫 번째 요소를 제거하고 (하나씩 줄이거 나) 작은 한 줄짜리 코드가 있습니까?Objective C에서 배열의 첫 번째 요소를 제거하려면 어떻게합니까?

+0

맨손 C 스타일 배열 또는 NSArray/NSMutableArray와 같은 것을 말하고 있습니까? –

+1

베어 스타일의 C 스타일 어레이의 경우 게이트에서 벗어나기 전에 문제가 발생합니다. C 스타일 어레이는 경계/유효한 크기 정보를 포함하지 않습니다. 나는 당신이 유효한 크기의 포인터를 전달할 수 있다고 추측하지만 그것은 추악해진다. –

+1

다시 C 스타일 배열의 경우, * p ++는 교대와 비슷한 것을 성취한다. –

답변

19

제거 된 항목을 반환하는 방법을 모르지만 NSArray#objectAtIndex:0NSMutableArray#removeObjectAtIndex:0을 조합하여이 작업을 수행 할 수 있습니다. shift 메서드를 구현하는 NSMutableArray에 새로운 메서드 범주를 도입 할 수 있다고 가정합니다.

+0

내가 인상적이었을 때 나는 ObjectAtIndex : 0을 PHP에서 찾을 수있는 것처럼 1의 인덱스로 시작한 배열로 남겨 두었습니다. 그러나 밝혀진 바와 같이, 그 중 하나를 부딪 히면 (내가 배열에 추가 한 가장 오래된 것임) 내가하는 일을 처리하기에 충분합니다. – ojreadmore

+1

링크 된 문서에서는 shift와 비슷하게 다른 요소를 아래로 밀어 내리는 동작을 수행합니다. –

+0

하나의 메소드 호출이 정말로 필요한 경우 필요한 것을 추가하는 샘플 카테고리 선언에 대한 내 대답을 참조하십시오. –

1

코코아 배열 객체 (NSArray/NSMutableArray)는 한 줄에 해당하는 것을 제공하지 않으므로 객체를 먼저 읽은 다음 제거해야합니다. 이 클래스가 -lastObject-removeLastObject이라는 메서드를 제공하지만 -firstObject-removeFirstObject이 아닌 메서드는 배열의 앞쪽에서 제거하는 것이 비효율적 인 작업임을 상기시켜야합니다. 그 이유는 내용을 한 위치 앞으로 이동해야하기 때문입니다. 이것은 본질적으로 포인터로 묶인 C의 배열에 특히 해당됩니다.

원시 데이터 형식 및/또는 매우 작은 배열을 사용하는 경우 첫 번째 요소를 "제거"하는 동작은 queue data structure을 나타내는 것으로 간주 할 수 있습니다. 객체 대기열을 만드는 방법에 대한 자세한 내용은 this SO question을 참조하십시오. 개인적으로 my opinion for that question은 실제 대기열 클래스가 가장 명확한 프로그래밍 관례를 제공한다는 것입니다.

@interface NSMutableArray (QueueOneLiner) 
    - (id) removeAndReturnFirstObject; // Verbose, but clearer than "shift" 
@end 

@implementation NSMutableArray (QueueOneLiner) 
    - (id) removeAndReturnFirstObject { 
    id object = [[self objectAtIndex:0] retain]; 
    [self removeObjectAtIndex:0]; 
    return [object autorelease]; 
    } 
@end 

그러나, 그 점 솔루션 것입니다 원인을 : 당신은 당신이 원하는 것을 할 수있는 한 줄도 제공하지 않습니다 것을 (아마 NSMutableArray의 또는 다른 클래스의 카테고리로) 자신의 방법을 정의 할 수 있습니다 코드를 사용하는 코드의 성능 대 단순성의 중요성에 따라 가치가있는 것보다 많은 오버 헤드가 발생합니다.

+1

QueueOneLiner가 잘못된 개체를 반환 할 수 있습니다. removeObjectAtIndex : 0은 가비지 콜렉션이 사용되지 않으면 조기에 할당을 해제 할 수있는 "object"를 해제합니다. 객체를 배열에서 제거하기 전에 객체를 유지하고 자동 갱신해야합니다. – dreamlax

+0

뛰어난 점! 제안 내용을 포함하도록 수정되었습니다. –

3

그렇게하는 것이 좋지 않습니다. 당신은 내 다른 게시물의 일부를 보면 아이폰에

오브젝티브 C는 실제로 C의 성능 특권의 대부분을 사용할 수 있습니다

, 당신은 내가 조기 최적화에 대해 단호 해요 볼 수 있지만, 때를 것 C 레벨에서 코딩하고 있습니다. 불필요하게하지 않는 것이 있습니다.

  • 이동 메모리
  • 중복 구조
  • 드문 드문 메모리 블록을 채워 할당
  • 내부는
  • ... (이 더 많이가 있지만 내 C-인생이 녹슨 내가 말한대로 루프 , 나는 반 - 최적화입니다.)

잘 구현 된 대기열이 필요합니다. 뭔가 큰 원형 메모리 구조를 미리 할당 한 다음 첫 번째 및 마지막 바이트를 추적하는 두 개의 포인터가 있습니다.

Objective-C에 대기열 데이터 구조가 없다는 사실에 놀랐습니다.

또한 단 하나의 라이너를 위해 노력하지 마십시오. 간결한 코드에 대한 모든 것들이 과대 평가되었습니다. 메서드를 호출하는 것이 더 합리적이라면 그렇게하십시오.당신이 obj 클래스/유형 이름과 arr가 배열 배열 obj *arr이있는 경우

+0

perl "arrays"는 C 배열보다 잘 구현 된 큐와 비슷합니다. 그들은 "첫 번째"요소와 마지막 요소에 대한 오프셋을 저장하고 필요한 경우 지능적으로 미리 할당합니다. – ysth

+0

Objective-C에서 Queue를 사용하는 더 많은 이유. 대부분의 인터프리터 언어는 컴파일 된 언어보다 약 100 배 느리다 - 그 속도로는 관심사가 완전히 다르며 모든 배열이 대기열의 오버 헤드를 갖게된다는 것이 합리적이다.하지만 C 언어에서는 그런 것을 찾을 수 없다. 기반 언어. –

1

, 당신은 단지 arr+1가 첫 번째 요소없이 배열을 얻을 수 말할 수 있습니다. 이 당신에게 도움이 될 수

[arrayName removeObjectAtIndex:0]; 

0

사용이 코드,

+0

이것은 받아 들여진 대답이 아직 제공하지 않았고'NSMutableArray' (NSArray가 아님)의 경우에만 사용할 수있는 유용한 정보를 더 제공하지 않습니다 – Stonz2

0

그것의 원래 포스터를 지원하지만 일반있는 NSArray 아닌있는 NSMutableArray이있는 경우,이 잘 작동 할 확실히 너무 늦게 :

id myData = myArray.firstObject; 
myArray = [myArray subarrayWithRange:NSMakeRange(1, myArray.count - 1)]; 
+0

배열에 항목이 하나만있는 경우가 아니라면 'loc' 값이 1이면 NSArray의 값을 벗어나고 NSRangeException을 던집니다. – SDJMcHattie

관련 문제