자료 저장소

출처: 유그드라실의 이야기

1. 몇가지 구조체
- NSRange 
int location, int length (시작 위치와 거기서 부터의 거리임)
NSRange range = NSMakeRange(17, 4);  (range 라는 범위를 17을 시작으로 해서 4개의 범위만큼 지정)

– NSPoint, NSSize, NSRect
float x, float y (실제 위치 점 x, y)
float width, float height (가로, 세로)
NSPoint origin, NSSize size (시작점, 시작점으로부터의 가로와 세로)

==========================================================================================================
2. 문자열 처리 클래스
– NSLog()
NSLog(@”Hi~!!”);
– NSString
① NSString *msg = [ NSString stringWithFormat:@"You selected %d", 3];
② int length = [msg length]; // msg 문자열의 길이를 리턴함
③ if(thing1 isEqualToString: thing2) // thing1과 thing2 두 문자열이 같은지 판단 같으면 YES, 다르면 NO
 compare 메소드도 있음 (리턴 타입은 NSComparisonResult임 : NSOrderedSame(같음), NSOrderedAscending(앞이 빠름), NSOrderDescending(뒤가 빠름)) 
예를 들어 [ @"aardvark" compare: @"zygote"]; 이런 경우 NSOrderedAscending 반환함
그 밖에도 비교시 여러가지 조건을 줄 수 있음 [ @"asdf" compare: @"ASDF" : options: NSCaseInsensitiveSearch]
⑤  원하는 문자열 찾기 (hasPrefix:@”검색문자열” – 시작 문자열 검색, hasSuffix:@”검색문자열” – 끝 문자열 검색)
원하는 문자열의 위치까지 찾기 (rangeOfString:@”검색문자열”) 리턴값은 NSRange로 나옴
⑥ 만들어진 문자열 변경을 위해서는 NSMutableString 사용
NSMutableString *string = [NSMutableString stringWithCapacity: 42]; // 문자열 길이 42까지
[string appendString: @"Hello there"];  // 문자열 만듬
[string appendFormat: @"human %d!", 40];  // 이어서 문자열 붙임

==========================================================================================================
3. NSArray
① NSArray *array = [NSArray arrayWithObjects: @"one", @"two", @"three", nil]; // 배열 생성
int cnt = [array count]; // 배열의 개수 얻음
NSLog(@”This is %d”, [array objectAtIndex: 2]); // three 리턴 됨
② NSMutableArray *array = [NSMutable Array arrayWithCapacity: 7]; // 7개 배열 요소를 갖는 수정 가능한 배열     
[array addObject: tire]; // tire 내용 추가
[array removeObjectAtIndex: 1]; // 2번째 배열 요소 제거, 제거후 배열 요소는 알아서 앞으로 채움
③ 이너머레이터 (enumerator : 배열을 한바퀴 돌게 하기 위해 사용하기 위한 녀석)
NSEnumerator *e = [array objectEnumerator]; // 반복을 위한 녀석 선언 및 불러옴, 
id thingie; // 만약 순서를 거꾸로 불러오려면, reverseObjectEnumerator 메소드 사용.
while (thingie = [e nextObject]) {  …  }//nextObject는 하나씩 불러오는 것을 말함 불러온 녀석은 thingie에 들어감
④ 빠른 이너머레이터
for (NSString *string in array) // array 이라는 배열에서 차례로 string으로 불러옴

==========================================================================================================
4. NSDictionary
NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys: t1, @"front-l", t2, @"front-r", t3, @"back-l", nil];
대응되는 딕셔너리의 값에 접근하려면 키 값을 검색하면 됨 ( 뒤에 값이 key 값임 )
Tire *tire = [tires objectForKey: @"back-l"]; // “back-l”이라는 문자열 키를 갖는 tire 객체를 연결해줌
// 수정되는 것까지 하려면… NSMutableDictionary 사용
NSMutableDictionary *tires = [NSMutableDictionary d];
[tires setObject:t1 forKey: @"front-l"]; // t1 이라는 타이어 객체를 키값 front-l로 주고, tires 딕셔너리에 추가함
[tires removeObjectForKey: @"front-l"]; // tires 딕셔너리에서 front-l 키값을 갖는 객체를 제거함

==========================================================================================================
5. NSNumber
NSArray 또는 NSDictionary에 int, float, struct 등을 넣기 위한 클래스
NSNumber *num = [NSNumber numberWithInt: 42]; // int  타입의 숫자 42 입력
[array addObject: num];
[dictionary setObject: num forKey: @"Bork"]; // 숫자 42를 array에 입력하고, 그것의 키값을 Bork로 지정
int num1 = [num intValue]; // num이 가지고 있는 값을 리턴함

==========================================================================================================
6. NSValue (NSArray, NSDictionary에 구조체 넣기 위해 사용), NSNull(NSArray, NSDictionary에 nil을 못 넣을때 사용)
pp. 179, 180, 181 참조
NSRect rect = NSMakeRect (1, 2, 30, 40);   // NSRect 값을 아래의 NSValue를 이용하여 *value에 입력
NSValue *value = [NSValue valueWithBytes: &rect  objCType: @encode(NSRect)];
[array addObject: value];                         // array 배열에 rect값 추가
value = [array objectAtIndex: 0];               // array 배열의 0번째에 있는 주소를 가지고 옴
[value getValue: &rect];                          // rect에 해당 값을 가지고 옴 ?? 아직 이해 안됨.-.-;,
==========================================================================================================    
7. NSDate (날짜와 시간 처리)
NSDate *date = [NSDate date];      // 현재 시간을 가지고 옴
NSLog (@”Today is %@”, date);    // 현재 시간 출력
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24*60*60)];    // 어제의 시간 계산
NSLog (@”Yesterday is %@”, yesterday);  // 어제 시간 출력
==========================================================================================================
8. NSData ( 바이트 덩어리로 래핑하는 클래스)
const char *string = “Hi there, this is a C String”;
NSData *data = [NSData dataWithBytes:string length:strlen(string)+1];   // 위의 string을 길이를 계산후 byte로 변경
NSLog (@”data is %@”, data);    // 이렇게 하면 data가 byte로 변경되어서 이상한 숫자들만 나옴
NSLog (@”%d byte string is ‘%s’”, [data length], [data bytes]);  // 데이터 길이와 제대로된 string이 출력됨
==========================================================================================================
9. 파일 저장과 읽기
NSArray *phrase;
phrase = [NSArray arrayWithObjects: @"I", @"seem", @"to", @"be", @"a", @"verb", nil];
[phrase writeToFile: @"/tmp/verbiage.txt" atomically: YES];    // txt 파일에 위의 배열 저장
// 저장한 파일 읽기
NSArray *phrase2 = [NSArray arrayWithContentsOfFile: @"/tmp/verbiage.txt"];   // 파일 읽어오기
NSLog (@”%@”,phrase2);   // 내용 출력
==========================================================================================================
10. 객체 인코딩 프로토콜
– (void) encodeWithCoder: (NSCoder *) aCoder;
– (id) initWithCoder: (NSCoder *) aDecoder;
(void) encodeWithCoder: (NSCoder *) aCoder {
[coder encodeObject: name forKey: @"name"];      // name이라는 키값에 실제 name 안의 값을 인코딩하여 넣음
[coder encodeFloat: shoeSize forKey: @"shoeSize"]; // 위와 마찬가지로 인코딩하여 넣음
}    // 리턴값은 없음 실제 인코딩하여 넣은 것은 NSKeyedArchiver에서 사용함, 아래는 Decode 부분임
(id) initWithCoder: (NSCoder *) decoder {
if(self = [super init]) {
self.name = [decoder decodeObjectForKey: @"name"];    // 이름 디코드
self.shoeSize = [decoder decodeFloatForKey: @"shoeSize"];  // 발 사이즈 디코드, Float 사용 주의
}
return (self);
}
// 아래 부분은 실제 인코드와 디코드의 사용 부분, archiver 사용해야 함
NSData *freezeDried;
freezeDried = [NSKeyedArchiver archivedDataWithRootObject: thing1];
// 위의 선언으로 thing1이라는 객체는 encodeWithCoder 메소드를 거쳐 NSData 타입으로 바뀌어 들어가진다.
[thing1 release];
thing1 = [NSKeyedUnarchiver unarchiveObjectWithData: freezeDried]; // NSData 타입인 freezeDried를 다시 변경
NSLog(@”reconstituted thing : %@”, thing1);   // 디코드 된 객체를 출력
==========================================================================================================
11. KVC (Key-Value Coding) // 그 밖에 편리기능은 p.323~335 참조
car 클래스에 name, medelYear등 변수명을 작성해 놓으면, 특별히 선언하지 않더라도 키-밸류 코딩이 가능해진다.
NSString *name = [car valueForKey:@"name"];  // car에 선언된 name 의 값을 가지고 올 수 있다.
NSLog (@”make is %@”, [car valueForKey:@"make"]);    // car에 선언된 make 내용 값을 가지고 올 수 있다.
// 값을 set 할 수도 있다.
[car setValue: @"harold" forKey:@"name"];    // name이라는 키 값에 harold 문자열을 입력해 줌.
[car setValue: [NSNumber numberWithFloat: 25062.4] forKey:@”mileage”];  // int, float와 같은 숫자의 경우 랩핑 필요함
==========================================================================================================
12. Predicate (프레디킷: 검색이나, 조건에 맞는 값들만 불러올때 사용) // 그밖에 구체적 내용은 p. 344~349 참조
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat: @"name== 'herbie'"];   // 이름이 herbie인 것을 찾도록 설정 한 것
// 형식 지정자 사용 가능: predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > %d", 50];
BOOL match = [predicate evaluateWithObject: car]; // 앞서 설정한 것을 car 클래스에 적용해 봄 (있으면 YES)

NSArray *results;
results = [cars filteredArrayUsingPredicate: predicate];   // 설정한 프레디킷에 일치하는 모든 것들을 배열로 가지고 옴
NSArray *names;
names = [results valueForKey:@"name"];    // 가지고 온 결과를 이름만 모두 배열로 가지고 옴

댓글 로드 중…

최근에 게시된 글