2010. 5. 31. 21:44
[17일차]Objective-C 2.0에서 추가된 기능 Objective-C2010. 5. 31. 21:44
Protocal의 옵션 지정이 가능
=> 1.0까지 에서는 Protocol의 모든 메서드를 구현하지 않으면 Warning : 실행은 가능
=> 2.0에서는 @required와 @optional을 지정해서 필수적으로 구현할것과 선택적으로 구현이 가능하도록 지정가능
defalult는 required
dev-c : objective-c 1.0 기반
x-code : objective-c 2.0 기반
cocoa
2. for 구문의 변경
1) for의 ( )안에서 변수 생성이 가능(지역변수)
2) for(변수명 in 배열명) <= nsdictionary 의 경우 key값을 리턴
=>배열의 모든 멤버가 순차적으로 변수에 하나씩 대입이 됩니다.
이 기능을 고속 열거라고 합니다.
=>단 변수에 대입되는 멤버는 오브젝트 이어야 합니다.
value 타입또는 일반 C 배열은 안됩니다.
=> enumerator를 반환할 수 있는 컬렉션 만이 배열명에 올 수 있습니다.
ex. nsarray 는 Object를 리턴
//가장 느림
NSArray * ar = 생성 ;
int i ;
for(i=0;i<[ar count];i++)
{
NSLog(@"%@",[ar ObjectAtIndex:i]);
}
// 가장빠름, 코딩양이 많음.
NSEnumerator * it ;
it = [ar getEnumerator];
NSString * str;
While((str=[it nextObject])!=nil)
{
NSLog(@"%@",str);
}
//코딩양도 적고 빠름. enumerator형태로 변환되어 실행
NSString * str
for(str in ar)
NSLog(@"%@",str);
======================================================================
ex) for ~ in 예제
#import <foundation/foundation.h>
int main()
{
NSAutorelease * pool = [[NSAutoreleasePool alloc]init];
NSArray* monthName = [NSArray arrayWithObjects:@"Janurary",@"Feburary",nil];
// NSArray 는 get Enumerator을 소유
for(NSString * temp in monthName)
NSLog(@"%@",temp);
[Pool drain];
return 0;
}
======================================================================
*잘못된 예
int ar[3]={1,2,3};
for(int n in ar)
// n 은 Object가 아님, int 계열에는 get Enumerator가 없음.
NSLog(@"%i",n);
======================================================================
* Property가 추가
=> 모든 멤버변수의 setter와 getter 문제 해결
예약어
@property : setter 와 getter의 선언
@synthesize : setter 와 getter의 구현
======================================================================
@interface Test:NSObject
{
int a;
}
-(void)setA:(int)n;
-(int)a;
// 위의 두 선언은 @property int a; 로 완전히 대체
// 멤버변수와 메소드가 동일한 이름을 가져도 문제가 없다.
@property(setter=setting:)int k;
@end
======================================================================
@implementation Test
-(void)setA:(int)n
// 여기부터
{
a=n;
}
-(int)a
{
return a;
}
// 여기까지 => synthesize a; 로 대체
-(void)setting :(int)x
{
k=x;
NSLog(@"K가 초기화");
}
@end
Teste *obj = [Test new];
[obj setk:10]; <=setter 구문을 그대로 사용가능
복사옵션지정 (property에 적용)
assign : 대입
retain : retain 메서드 호출
copy : 얕은 복사
=> NSArray * ar; 얕은 복사 문제발생 가능성 높음 // objective-c는 참조형 배열
NSString * str ; 얕은 복사 문제 발생가능성이 적음
=> 1.0까지 에서는 Protocol의 모든 메서드를 구현하지 않으면 Warning : 실행은 가능
=> 2.0에서는 @required와 @optional을 지정해서 필수적으로 구현할것과 선택적으로 구현이 가능하도록 지정가능
defalult는 required
dev-c : objective-c 1.0 기반
x-code : objective-c 2.0 기반
cocoa
2. for 구문의 변경
1) for의 ( )안에서 변수 생성이 가능(지역변수)
2) for(변수명 in 배열명) <= nsdictionary 의 경우 key값을 리턴
=>배열의 모든 멤버가 순차적으로 변수에 하나씩 대입이 됩니다.
이 기능을 고속 열거라고 합니다.
=>단 변수에 대입되는 멤버는 오브젝트 이어야 합니다.
value 타입또는 일반 C 배열은 안됩니다.
=> enumerator를 반환할 수 있는 컬렉션 만이 배열명에 올 수 있습니다.
ex. nsarray 는 Object를 리턴
//가장 느림
NSArray * ar = 생성 ;
int i ;
for(i=0;i<[ar count];i++)
{
NSLog(@"%@",[ar ObjectAtIndex:i]);
}
// 가장빠름, 코딩양이 많음.
NSEnumerator * it ;
it = [ar getEnumerator];
NSString * str;
While((str=[it nextObject])!=nil)
{
NSLog(@"%@",str);
}
//코딩양도 적고 빠름. enumerator형태로 변환되어 실행
NSString * str
for(str in ar)
NSLog(@"%@",str);
======================================================================
ex) for ~ in 예제
#import <foundation/foundation.h>
int main()
{
NSAutorelease * pool = [[NSAutoreleasePool alloc]init];
NSArray* monthName = [NSArray arrayWithObjects:@"Janurary",@"Feburary",nil];
// NSArray 는 get Enumerator을 소유
for(NSString * temp in monthName)
NSLog(@"%@",temp);
[Pool drain];
return 0;
}
======================================================================
*잘못된 예
int ar[3]={1,2,3};
for(int n in ar)
// n 은 Object가 아님, int 계열에는 get Enumerator가 없음.
NSLog(@"%i",n);
======================================================================
* Property가 추가
=> 모든 멤버변수의 setter와 getter 문제 해결
예약어
@property : setter 와 getter의 선언
@synthesize : setter 와 getter의 구현
======================================================================
@interface Test:NSObject
{
int a;
}
-(void)setA:(int)n;
-(int)a;
// 위의 두 선언은 @property int a; 로 완전히 대체
// 멤버변수와 메소드가 동일한 이름을 가져도 문제가 없다.
@property(setter=setting:)int k;
@end
======================================================================
@implementation Test
-(void)setA:(int)n
// 여기부터
{
a=n;
}
-(int)a
{
return a;
}
// 여기까지 => synthesize a; 로 대체
-(void)setting :(int)x
{
k=x;
NSLog(@"K가 초기화");
}
@end
Teste *obj = [Test new];
[obj setk:10]; <=setter 구문을 그대로 사용가능
복사옵션지정 (property에 적용)
assign : 대입
retain : retain 메서드 호출
copy : 얕은 복사
=> NSArray * ar; 얕은 복사 문제발생 가능성 높음 // objective-c는 참조형 배열
NSString * str ; 얕은 복사 문제 발생가능성이 적음