레이블이 iOS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 iOS인 게시물을 표시합니다. 모든 게시물 표시

2012년 2월 10일 금요일

iOS 셀렉터 selector


@selector
프로그램내부에서 메서드를 호출하면 컴파일 시 내부에 표현되는값으로 변경을 가해서 호출합니다.
이러한내부 표현에 해당하는 데이터 타입을 SEL타입이라고 합니다.
delegate나함수 포인터와 같은 역할을 하는 지시자입니다.
사용방법은 @selector(메서드명)으로리턴 받습니다.
매개변수가 있는 경우에는 메서드 명 뒤에 :을붙여서 사용합니다
이@selector를호출할 때는 객체가 performSelector:@selector(메서드)의형태나 SEL변수를 이용합니다.
매개변수가object인 경우에는performSelector:@selector(메서드)withObject:객체 의형태로 호출합니다.
이를적당히 이용하면 동적으로 메시지를 변경할 수 있습니다

iOS배열 array


1.배열 객체의 종류
Foundation배열은 인스턴스의정렬된 모임입니다.
일반적인언어에서는 배열의 원소는 특정한 하나의 자료형으로구성되지만 여러 자료형으로 만들 수도 있습니다.
배열도2가지가있습니다.
수정이불가능한 NSArray 과수정이 가능한 NSMutableArray이있습니다.
배열클래스는 NSArray.h 헤더파일에 정의되어 있습니다.

2.NSArray의 생성과요소 접근
1)NSArray의 생성
NSArray* 배열명 =[NSArray arrayWithObjects: 인스턴스나열.., nil];
배열원소의 나열이 끝나면 마지막에 nil을삽입해야 합니다.
배열원소의 끝을 나타내는 것으로 실제로 저장되지는않습니다.
arrayWithObjects는생성자 입니다.

다른배열로부터의 복사해서 초기화
-(id)initWithArray:(NSArray*)anArray

-(void)getObjects: (id *)aBuffer
C 형태의배열에 복사

2)NSArray의 요소 접근
[배열이름 count]=> 배열의 요소개수 리턴
[배열이름 objectAtIndex: 인덱스]메서드를 이용해서 리턴받을 수 있습니다.
[배열이름 indexOfObject:(id)anObject]anObject가 배열에있으면 위치를 리턴하고 찾지 못하면 NSNotFound를리턴합니다.
-(id)lastObject:마지막 인스턴스리턴

intmain(int argc, char *argv[])
{
inti;
NSNumber*intNumer = [NSNumber numberWithInteger :100];
NSArray* month = [NSArray arrayWithObjects:
@"January",@"February", @"March", @"April",
@"May",@"June", @"July", @"August",@"September",
@"October",@"November", @"December",intNumer, nil];
NSLog(@"한글 영문");
NSLog(@"===== ====");
for(i = 0; i < [month count]; ++i)
NSLog(@"%2i월 %@",i + 1, [month objectAtIndex: i] );
return0;
}

=======================================================================
 NSMutableArray
배열의요소인 객체를 제거하거나 삽입할 수 있는 메서드가제공되는 배열 클래스

메서드
-(id)initWithCapacity:(NSUinteger)numItems
numItems의개수를 가진 배열을 생성

-(void)addObject:(id)anObject
anObject를마지막에 추가
이인수의 값이 nil이면안됨

-(void)addObjectsFromArray:(NSArray*)otherArray
otherArray를추가

-(void)insertObject:(id)anObjectatIndex:(NSUinter)index
index번째에 anObject추가

-(void)replaceObjectAtInde:(NSUinter)indexwithObject:(id)anObject
index번째에 Object를anObject로변경

-(void)setArray:(NSArray*)otherArray
모든내용을 초기화하고 otherArray로변경

-(void)removeAllObjects
모든요소 제거

-(void)removeLastObjects
마지막요소 제거

-(void)removeObjectAtIndex:(NSUinter)index
index번째 제거

-(void)removeObject:(id)anObject
anObject찾아서 제거

예제)
int main(int argc, char *argv[])
{

int i;
NSMutableArray *mAr = [NSMutableArray arrayWithCapacity: 10];
[mAr addObject: [NSNumber numberWithInteger: 1]];
[mAr addObject: [NSNumber numberWithInteger: 5]];
[mAr addObject: [NSNumber numberWithInteger: 7]];
for (i = 0 ; i < [ mAr count]; ++i)
NSLog (@"%d", [[mAr objectAtIndex: i] integerValue]);
[mAr insertObject: [NSNumber numberWithInteger: 3] atIndex:1];
NSLog(@"추가된 후");
for (i = 0 ; i < [ mAr count]; ++i)
NSLog (@"%d", [[mAr objectAtIndex: i] integerValue]);
[mAr replaceObjectAtIndex:1 withObject:[NSNumber numberWithInteger: 4]];
NSLog(@"변경된 후");
for (i = 0 ; i < [ mAr count]; ++i)
NSLog (@"%d", [[mAr objectAtIndex: i] integerValue]);
[mAr removeObjectAtIndex:1];
NSLog(@"삭제된 후");
for (i = 0 ; i < [ mAr count]; ++i)
NSLog (@"%d", [[mAr objectAtIndex: i] integerValue]);
return 0;
}

iOS기존의 앱을 업데이트할떄


XCode3.2.3 과 SDK4로 버전업한 후, 기존 앱을 업그레이드 할 때 간단한 Tip 입니다.

1. XCode3.2.3과 SDK4로 업그레이드 한다. 별도로 기존 XCode 3.1 버전을 따로 보관할 필요가 없습니다.

2. 기존 앱을 새 XCode3.2.3에서 연다.

3.Group & Files를 right click -> Get Info 후

  3-1.General Tab 에서
Project Format 을 Xcode 3.2-compatible 로 바꾼다.

 3-2.Build Tab 에서

 Base SDK를 iPhone Device 4.0(배포시), 혹은 iPhone Simulator 4.0(테스트시) 로 바꾼다

 iPhone OS Deployment Target 을 iPhone OS 3.0 (즉 지원하고자 하는 하위버전으로) 로 바꾼다.


이렇게 하시면 됩니다.

NSDictionary


Dictionary

키와 인스턴스로 이루어진 데이터의 모임입니다
키로 인스턴스를 찾을 수 있습니다.<?xml:namespace prefix = o />
키는 유일해야 하며 일반적으로 NSString 입니다.
키와 연결된 인스턴스는 데이터 유형에 관계가 없지만 nil은 안됩니다.

1. NSDictionary
NSDictionary는 수정이 불가능한 Dictionary입니다.

멤버 메서드
+(id)dictionary
비어있는 dictionary 생성
+(id)dictionaryWithObject:(id)anObject forKey:(id)aKey
aKey를 key로 해서 anObject를 내용으로 갖는 인스턴스를 갖는 dictionary 생성
-(id)initWithObjects:(NSArray *)Objects forKeys:(NSArray *)Keys
Keys를 키 값으로 해서 Objects를 내용으로 초기화
-(id)initWithObjects:(id *)Objects forKeys:(id *)Keys count:(NSUInteger)count
Keys를 키 값으로 해서 Objects를 내용으로 count 개수 만큼 초기화
-(id)initWithObjectsAndKeys:(id)Object,(id)Key,… nil
Object와 Key로 초기화
-(NSUInteger)count
개수 리턴
-(id)objectForKey:(id)aKey
aKey에 해당하는 인스턴스 리턴
-(NSArray *)allKeys
모든 키값을 배열로 리턴
-(NSArray *)allValues
모든 키를 포함하는 배열을 리턴
-(NSEnumerator *)keyEnumerator
키 값을 열거자로 리턴
-(NSEnumerator *)objectEnumerator
키 값을 열거자로 리턴
-(NSArray *)allKeysForObject:(id)anObject
anObject를 갖는 모든 키를 배열로 리턴


NSDictionary * greeting = [[NSDictionary alloc] initWithObjectsAndKeys:@"안녕하세요", @"아침인사", @"식사 하셨어요", @"오후인사", @"내일뵐께요",@"저녁인사",nil ];
    NSLog(@"아침인사: %@", [greeting objectForKey: @"아침인사"]);
        NSLog(@"점심인사: %@", [greeting objectForKey: @"오후인사"]);
        NSLog(@"저녁인사: %@", [greeting objectForKey: @"저녁인사"]);
   
    NSArray * keys = [greeting allKeys];
    NSArray * objects = [greeting allValues];
    int i;
    for(i=0; i<[greeting count]; i++)
    {
       NSLog(@"Key:%@ Value:%@", [keys objectAtIndex:i], [objects objectAtIndex:i]);
    }    
   
    NSDictionary * greeting1 = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
    NSEnumerator *it;
    it = [greeting1 keyEnumerator];
    id var;
    for(i=0; i<[greeting count]; i++)
    {
       var = [it nextObject];
       NSLog(@"Key:%@ Value:%@", var, [greeting objectForKey: var]);
    }

=========================================================================================
2. NSMutableDictionary
NSMutableDictionary는 수정이 가능한 Dictionary입니다.
아래와 같은 메서드가 추가됩니다.
+(id) dictionaryWithCapacity:size
size 크기만큼으로 메모리 할당
-(id)initWithCapacity:size
size 크기만큼으로 초기화
-(void)setObject:(id)anObject forKey:(id)aKey
aKey를 Key로 anObject를 추가합니다.
둘 다 nil이면 안되고 aKey가 존재한다면 내용은 대체됩니다.
-(void)removeAllObjects
모든 엔트리 삭제
-(void)removeObjectForKey:key
key에 해당하는 인스턴스 삭제
-(NSArray *)keysSortedByValueUsingSelector:@selector(비교메서드:)
이 경우 내용에 따라서 정렬한 후 key를 배열로 리턴합니다.

NSMutableDictionary *greeting = [NSMutableDictionary dictionary];
        [greeting setObject:@"안녕하세요" forKey: @"아침인사"];
        [greeting setObject:@"식사 하셨어요" forKey:@"오후인사"];
        [greeting setObject:@"내일뵐께요" forKey:@"저녁인사"];
        [greeting setObject:@"잘자요" forKey:@"밤인사"];
    [greeting setObject:@"밤새 별일 없으셨어요" forKey: @"아침인사"];
   
    NSArray * keys = [greeting allKeys];
      
    int i;
    for(i=0; i<[greeting count]; i++)
    {
       NSLog(@"Key:%@ Value:%@", [keys objectAtIndex:i], [greeting objectForKey:[keys objectAtIndex:i]]);
    }    
   
    [greeting removeObjectForKey:@"밤인사"];
    keys = [greeting allKeys];
    NSLog(@"삭제한 후 -------------");
    for(i=0; i<[greeting count]; i++)
    {
       NSLog(@"Key:%@ Value:%@", [keys objectAtIndex:i], [greeting objectForKey:[keys objectAtIndex:i]]);
    }

    keys = [greeting keysSortedByValueUsingSelector:@selector(compare:)];

    NSLog(@"내용으로 정렬 한 후 ----");
    for(i=0; i<[greeting count]; i++)
    {
       NSLog(@"Key:%@ Value:%@", [keys objectAtIndex:i], [greeting objectForKey:[keys objectAtIndex:i]]);
    }

NSString&NSData


C언어의문자열은 char를기준으로 한 ASCII문자열입니다.
하자만Objective- C언어의 문자열클래스가 제공하는 문자열은 unichar유니코드 표준에따른 멀티바이트 문자입니다.
1.String 클래스의종류
-NSString: 내용을 변경할수 없는 문자열 클래스
-NSConstantString: 문자열상수로 주소를 변경할 수 없는 문자열 클래스
-NSMutableString: 내용을변경할 수 있는 문자열 클래스

NSString객체에 문자열을 대입할때는 NSConstantString 타입을대입할 때는 일반 value형
변수처럼직접 대입이 가능하며 리턴도 가능합니다.
단주의할 점은 출력할 때 %s를사용하면 안된다는 점입니다.
%s를사용하게 되면 ascii문자(8비트)단위로 읽어서문자열을 출력하므로 이상한 문자열을 출력하게될것입니다.
이때는 %@를이용해서 출력해야 합니다.
%@를이용하게 되면 지정된 인스턴스에 description메시지를 전송하여그 메시지의 수행 결과를 리턴 받아서 출력하게 됩니다.



2.NSString 의인스턴스 생성과 문자 코드 변환
+(id)stringWithString:(NSString *)nsstring
nsstring으로인스턴스를 생성해서 리턴

-(id)initWithString:(NSString *)nsstring
nsstring으로초기화

-(NSUinteger)length
문자의개수 리턴

-(id)initWithUTF8String:(const char *)bytes
널문자로 끝나는 형식의 C언어문자열에서 정보를 복사한 후 초기화

-(constchar *)UTF8String
C언어문자열을 가리키는 포인터를 리턴


-(NSString*)stringWithString:(NSString *)nsstring
메모리를할당하고 nsstring으로초기화하는 생성자의 역할을 수행 – new와같은 역할
-(NSString*)stringByAppendingString: (NSString *)nsstring
nsstring을호출하는 인스턴스에 결합
-(BOOL)isEqualToString:(NSString *)nsstring
문자열의값이 같은지 여부를 리턴
-(NSComparisonResult)compare: (NSString *)nsstring
크기비교를 해서 NSComparisonResult로리턴
NSComparisonResult는열거형입니다.
-(NSString*)uppercaseString
대문자로변환해서 리턴
-(NSString*)lowercaseString
소문자로변환해서 리턴

3.NSString의 부분문자열 얻기
문자열을부분적으로 리턴 받을 수 있습니다.
-(NSString*)substringToIndex:정수
앞에서부터정수만큼 리턴
-(NSString*)substringFromIndex:정수
정수번째부터 리턴
-(NSString*)substringWithRange: : NSMakeRange(숫자1,숫자2)
숫자1부터숫자2까지리턴
-(NSRange)rangeOfString:(NSString *)nsstring
nsstring의위치와 개수를 리턴
NSRange는구조체로 location과length를가지고 있습니다.

===============================================
4.NSMutableString 클래스
NSString으로부터상속받아서 만들어지며 추가 및 삽입 및 삭제 등의메서드가 추가되어 있습니다.
문자열의내용을 변경할 수 있는 클래스
이클래스의 인스턴스는 문자열의 내용이 변경되도 주소가변경되지 않습니다.

================================================
5.NSData 클래스
이클래스는 바이트 배열을 다루는 클래스입니다.
파일입출력이나 네트워크에서는 문자열을 바이트 단위로사용해야 하는 경우가 있습니다.
이러한경우 NSString 만으로모든 처리를 할 수는 없습니다.
이런경우 사용되는 클래스가 NSData클래스입니다.

-(id)dataWithBytes:(const void *)bytes (NSUinteger)length
length만큼 바이트를 할당해서메모리를 할당
-(id)initWithBytes:(const void *)bytes length:(NSUinteger)length
bytes가지정한 위치부터 length까지로초기화
-(id)dataWithData:(NSData *)aData
aData를복사해서 메모리를 할당
-(id)initWithData:(NSData *)aData
aData의내용으로 초기화해서 리턴
-(NSUinteger)length
길이를리턴
-(cosst void *)bytes
포인터를리턴
-(NSString *)description
문자열로리턴

==========================================================
6.NSMutableData 클래스
변경가능한 Data 클래스입니다.
데이터의추가 및 삭제 등의 메서드가 더 존재 합니다.

2012년 2월 8일 수요일

오브젝티브C 상속


상위클래스의 멤버를 하위 클래스에게 물려주는 것을상속이라고 합니다.
상위클래스의 모든 멤버를 물려받습니다.
상위클래스를 superclass 또는 baseclass라고 하며 하위클래스를 subclass 또는 derivedclass 라고도 합니다.
1)상속 방법
@interface클래스이름:상속하는 클래스

ObjectiveC에서는 NSObject클래스가 최상위 클래스이며모든 클래스는 이 클래스로부터 상속을 받아야만합니다.
다른클래스가 이미 상속을 받았다면 그 클래스로부터 상속을받아도 됩니다.
여기에는여러 가지 멤버가 정의되어 있습니다.
대표적인메서드로는 isa라는멤버 변수와 메모리 할당과 관련된 alloc,dealloc(직접 호출하지않음 – 오버라이드 하는 경우 제외),release, retain(자기자신을 리턴),finalize 같은 멤버들을 가지고 있으며 init,initialize, new 등과같은 초기화 메서드 들도 가지고 있습니다.
하위클래스에서는 상위 클래스의 멤버를 다시 정의하지않아도 있는 것으로 간주합니다.
자신의멤버를 정의하고자 한다면 정의하고자 하는 내용을기재하면 되고 정의할 내용이 없다면 블록만 연 후닫아도 됩니다.