본문 바로가기

Programming/iPhone, Xcode

iPhone App 개발 - NSMutableArray 에 관하여

NSMutableArray 에 관하여 썰을 풀어 놓아볼까 한다.


일단 이 클래스의 참고 개괄적인 정보를 보면 아래와 같다.


NSMutableArray Class Reference

Inherits from

NSArray : NSObject

Conforms to

NSCoding (NSArray)

NSCopying (NSArray)

NSMutableCopying (NSArray)

NSFastEnumeration (NSArray)

NSObject (NSObject)

Framework

/System/Library/Frameworks/Foundation.framework

Availability

Available in iOS 2.0 and later.

Declared in

NSArray.h

NSPredicate.h

NSSortDescriptor.h

Companion guides

Collections Programming Topics

Key-Value Coding Programming Guide

Related sample code

BonjourWeb

LocateMe

SeismicXML

TableViewSuite

TaggedLocations

Overview

The NSMutableArray class declares the programmatic interface to objects that manage a modifiable array of objects. This class adds insertion and deletion operations to the basic array-handling behavior inherited from NSArray.

Subclassing Notes

There is typically little reason to subclass NSMutableArray. The class does well what it is designed to do—maintain a mutable, ordered collection of objects. But there are situations where a custom NSArray object might come in handy. Here are a few possibilities:

  • Changing how NSMutableArray stores the elements of its collection. You might do this for performance reasons or for better compatibility with legacy code.
  • Acquiring more information about what is happening to the collection (for example, statistics gathering).

Methods to Override

NSMutableArray‘s methods are conceptually based on these primitive methods:

  • insertObject:atIndex:
  • removeObjectAtIndex:
  • addObject:
  • removeLastObject
  • replaceObjectAtIndex:withObject:

In a subclass, you must override all these methods, although you can implement the required functionality using just the first two (however this is likely to be inefficient). You must also override the primitive methods of the NSArray class.



NSMutableArray 클래스는 NSArray 클래스를 상속받아서 자료를 추가/삭제 하는 기능이 더해진 클래스이다. Mutable 이 의미하듯이 객체들의 배열은 수정가능하다. 보통 NSMutableArray 를 상속받아서 사용하는 경우는 드물다. NSArray 객체를 조금 변형해서 사용하면 편한 경우가 있는데, 성능상의 이유 혹은 기존 코드와의 호환성 문제로 인해 NSMutableArray 가 데이터를 저장하는 방법을 변경하고자 할 때 편하다. 그리고 배열에 어떤 일들이 일어나는 지 자세히 알고 싶을 경우이다.


만약 NSMutableArray 를 상속받을 경우, 아래와 같은 메소드들을 전부 override 해야 한다. 그리고 NSArray 클래스의 primitive 메소드들도 override 해야한다.

1. insertObject:atIndex:

2. removeObjectAtIndex:

3. addObject

4. removeLastObject

5. replaceObjectAtIndex:withObject


NSMutableArray 를 생성하고 초기화 하는 방법은 간단하다.

arrayWithCapacity 라는 클래스 메소드를 이용하여 생성하고 초기화 하면 된다.


Reference documentation 을 살펴보면 아래와 같다.

arrayWithCapacity:

Creates and returns an NSMutableArray object with enough allocated memory to initially hold a given number of objects.

+ (id)arrayWithCapacity:(NSUInteger)numItems

Parameters

numItems

The initial capacity of the new array.

Return Value

A new NSMutableArray object with enough allocated memory to hold numItems objects.



그래서 아래의 코드는 자료를 2개 넣을 수 있는 NSMutableArray 가 생성되어서 personDetails 라는 reference 에 할당이 된다.

 NSMutableArray *personDetails = [NSMutableArray arrayWithCapacity:2];


이번에는 생성된 배열에 객체를 추가해 보자. 객체를 추가하는 메소드는 아래와 같다.

addObject:

Inserts a given object at the end of the array.

- (void)addObject:(id)anObject

Parameters

anObject

The object to add to the end of the array's content. This value must not be nil.


NSString 도 객체이기 때문에 간편하게 클래스 정의 없이 바로 배열에 넣어보자.

NSString *firstName = @"John";

[personDetails addObject : firstName];


이제 자료가 추가된 배열에 객체를 삽입해 보자. 객체를 삽입하도록 하는 메소드는 아래와 같다.

 insertObject:atIndex:

Inserts a given object into the array's contents at a given index.

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index

Parameters

anObject

The object to add to the array's content. This value must not be nil.


아래 코드는 personDetails 라는 배열의 첫번째 위치에 "Smith" 라는 문자열을 삽입하는 코드이다.

[personDetails insertObject: @"Smith" atIndex:0