Tip : Xcode에서 작업 중인 코드의 class나 method 등을 "opt + double click" 하면
해당 class 또는 method에 대한 documentation을 볼 수 있다.
@ Some Useful Types
- NSRange
NSRange는 다음과 같이 정의된 구조체이다.
typedef struct _NSRange {
unsigned int location;
unsigned int length;
} NSRange;
다음과 같이 초기화할 수 있다.
NSRange range;
range.location = 17;
range.length = 4;
또는
NSRange range = {17, 4};
또는
NSRange range = NSMakeRange (17, 4);
- Geometric Types
typedef struct _NSPoint {
float x;
float y;
} NSPoint;
typedef struct _NSSize {
float width;
float height;
} NSSize;
typedef struct _NSRect {
NSPoint origin;
NSSize size;
} NSRect;
위의 타입들은 NSMakePoint(), NSMakeSize(), NSMakeRect()의 함수로 초기화 할 수 있다.
@ Class Methods
다음과 같이 '-'가 아닌 '+'로 정의되는 method는 class method로서 객체 생성 없이도 호출할 수 있는 메소드를 의미한다.
즉 Java의 static method와 같다.
+ (id) stringWithFormat: (NSString*) format, ...;
class method는 다음과 같이 호출할 수 있다.
NSString* str = [NSString stringWithFormat:@"I'm %d years old", 22];
@ NSString
+ (id) stringWithFormat: (NSString*) format, ...;
- (unsigned int) length;
- (BOOL) hasPrefix: (NSString*) string;
- (BOOL) hasSuffix: (NSString*) string;
- (NSRange) rangeOfString: (NSString*) string;
- (NSArray) componentSeperateByString: (NSString*) string;
- (BOOL) isEqualToString: (NSString*) string;
- (NSComparisonResult) compare: (NSString*) string;
- (NSComparisonResult) compare: (NSString*) string
options: (unsigned) mask;
NSComparisonResult는 다음과 같이 정의된 enum이다.
typedef enum _NSComparisonResult {
NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending
} NSComparisonResult;
mask 옵션은 다음과 같은 세가지가 있고 '|'로 두 옵션을 동시에 사용할 수 있다.
NSCaseInsensitiveSearch : 대소문자 무시
NSLiteralSearch : 대소문자 구분을 포함하여 완전히 일치하는지
NSNumericSearch : 숫자를 character value가 아닌 숫자 그 자체로 인식 */
compare 메소드의 사용 예는 다음과 같다.
if([string1 compare: string2
options: NSCaseInsensitiveSearch | NSNumericSearch]
== NSOrderedSame)
{
NSLog(@"They match!");
}
@ NSMutableString
NSMutableString은 NSString의 subclass로 NSString과 달리 변형가능한 string이다.
즉, NSString이 Java의 String이라면 NSMutableString은 BufferedString이다.
+ (id) stringWithCapacity: (unsigned) capacity;
- (void) appendString: (NSString*) string;
- (void) appendFormat: (NSString*) format, ...;
- (void) deleteCharactersInRange: (NSRange) range;
NSMutableString의 생성은 다음과 같이 한다.
NSMutableString* string = [NSMutableString stringWithCapacity: 50];
capacity는 string의 예상되는 최대 길이로 최적화를 위해 사용되는 것이지 최대 길이를 제한하는 것은 아니다.
@ NSArray
NSArray는 object만을 담을 수 있고 다음과 같이 생성한다.
NSArray* array = [NSArray arrayWithObjects: @"one", @"two" @"three", nil];
+ (id)arrayWithObjects:(id) object1, ...;
- (unsigned) count;
- (id) objectAtIndex: (unsigned int) index;
- (NSString*) componentJoinedByString: (NSString*) string;
NSString 클래스의 componentSeperateByString 메소드와
NSArray 클래스의 componentJoinedByString 메소드는 다음과 같이 사용한다.
NSString* str1 = @"Mon:Tue:Wed:Thu:Fri:Sat:Sun";
NSArray* days = [str1 componentsSeparatedByString:@":"];
NSString* str2 = [days componentsJoinedByString:@"#"];
그 결과 days는 {Mon, Tue, Wed, Thu, Fri, Sat, Sun}이 되고
str2는 Mon#Tue#Wed#Thu#Fri#Sat#Sun이 된다.
@ NSMutableArray
NSArray는 일단 생성되면 원소를 추가하거나 제거할 수 없다.
반면 NSMutableArray는 원소를 자유롭게 추가하거나 제거할 수 있다.
즉 NSArray가 Java의 기본 array라면 NSMutableArray는 ArrayList 또는 Vector와 유사하다고 할 수 있다.
+ (id) arrayWithCapacity: (unsigned) numItems;
- (void) addObject: (id) object;
- (void) removeObjectAtIndex: (unsigned) index;
@ NSEnumerator
NSEnumerator 클래스는 array의 각 원소에 차례로 접근하기 위하여 사용된다.
array객체의 enumerator를 생성한 뒤 nextObject 메소드를 통해 그 array의 원소를 차례로 하나씩 접근할 수 있다.
다음은 NSEnumerator를 사용하는 예제 프로그램이다.
#import <Foundation/Foundation.h>
int main(void)
{
NSMutableArray* array = [NSMutableArray arrayWithCapacity:10];
NSString* s1 = @"Hello";
NSString* s2 = @"My";
NSString* s3 = @"Name is Jaehee";
[array addObject:s1];
[array addObject:s2];
[array addObject:s3];
NSEnumerator* enumerator = [array objectEnumerator];
id thingie;
while(thingie = [enumerator nextObject]) {
NSLog(@"%@", thingie);
}
return 0;
}
Mac OS X 10.5(Leopard) 이후 버전부터는 별도의 NSEnumerator 객체의 생성 없이
다음과 같이 보다 간편한 enumeration이 가능하다.
for(NSString* element in array) {
NSLog(@"%@", element);
}
@ NSDictionary
+ (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;
- (id) objectForKey: (id) key;
NSDictionary 클래스는 일종의 HashTable이다.
즉, table에 어떤 object들과 그 각각에 해당하는 key들을 저장해놓으면 이제 key를 통하여
table에서 해당 object를 꺼내올 수 있고, 그 사용법은 아래와 같다.
Student* s1 = [Student new];
Student* s2 = [Student new];
Student* s3 = [Student new];
NSDictionary* students = [NSDictionary dictionaryWithObjectsAndKeys:
s1, @"101", s2, @"102", s3, @"103", nil];
Student* s = [students objectForKey: @"102"];
@ NSMutableDictionary
NSMutableDictionary 클래스는 크기가 변할 수 있는 NSDictionary이다.
+ (id) dictionaryWithCapacity: (unsigned int) numItems;
- (void) setObject: (id) object forKey: (id) key;
- (void) removeObjectForKey: (id) key;
@ NSNumber
NSArray, NSMutableArray와 NSDictionary, NSMutableDictionary는 오직 object만을 담을 수 있다.
즉 int, float등과 같은 primitive type의 값은 저장할 수 없다.
NSNumber 클래스는 이와 같은 primitive type의 값을 object로 wrapping하여
NSArray나 NSDictionary 등에 담을 수 있게 해준다.
또한 NSNumber의 값을 다시 primitive type으로 변경할 수 있도록 해준다.
+ (NSNumber*) numberWithChar: (char) value;
+ (NSNumber*) numberWithInt: (int) value;
+ (NSNumber*) numberWithFloat: (float) value;
+ (NSNumber*) numberWithBool: (BOOL) value;
- (char) charValue;
- (int) intValue;
- (float) floatValue;
- (BOOL) boolValue;
- (NSString*) stringValue;
@ NSValue
NSValue는 구조체 등과 같은 임의의 값들을 object로 wrapping하고
그 object로부터 다시 원래 값을 꺼내올 수 있도록 해준다.
NSNumber는 NSValue의 subclass이다.
+ (NSValue*) valueWithBytes: (const void*) value
objCType: (const char*) type;
- (void) getValue: (void*) value;
+ (NSValue*) valueWithPoint: (NSPoint) point;
+ (NSValue*) valueWithSize: (NSSize) size;
+ (NSValue*) valueWithRect: (NSRect) rect;
- (NSPoint) pointValue;
- (NSSize) sizeValue;
- (NSRect) rectValue;
@ NSNull
NSArray나 NSDictionary에서는 nil이 끝을 나타내기 때문에 그 원소로서 nil을 가질 수 없다.
그러나 경우에 따라 해당 원소에 '아무것도 없음'을 나타내기 위하여 nil을 집어넣고 싶을 때가 있다.
이를 위하여 NSNull 클래스가 존재한다.
+ (NSNull*) null;
Reference
[1] Dalrymple. M., Learn Objective-C on the Mac, Apress.
'개발 > App Developer' 카테고리의 다른 글
IB 없이 하기, UITableView끝장보기 (3) 셀의 구조 (0) | 2010.09.06 |
---|---|
IB 없이 하기, UITableView끝장보기 (4) 테이블 편집 (0) | 2010.09.06 |
메소드와 메세지 (0) | 2010.09.06 |
HIG 번역하다 말았네요 (0) | 2010.09.06 |
IB 없이 하기, UITableView끝장보기 (5) 인덱스 (0) | 2010.09.01 |