달력

10

« 2024/10 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
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 ; 얕은 복사 문제 발생가능성이 적음



:
Posted by 에너지발전소