posted by By훈트 2011.01.07 12:43

Protocol Java interface 같다 어떤 protocol 따르는(adopting하는클래스는 protocol에서 선언된 모든 메소드들을 구현해야한다.


  다음은 object copy하는 copyWithZone 메소드가 담긴 NSCopying protocol 선언과 이것을 adopt하는 클래스의 @interface이다.


    @protocol NSCopying


    - (id) copyWithZone: (NSZone*) zone;


    @end



    @interface Car : NSObject <NSCopying> // <NSCopying, NSCoding> 같이 

                                                                // 여러개의 protocal adopt 수도 있다.

    {

        // instance variables...

    }


    // methods...

    // protocol 안에 선언되어 있는 메소드는 따로 다시 선언할 필요 없다.


    @end



  copyWithZone 메소드의 zone 할당할 메모리 영역을 나타내는 NSZone 타입의 매개변수이다. object copy 메소드를 호출할 경우내부적으로 copyWithZone 메소드로 변환되어 호출된다따라서 클래스에 따라  copyWithZone 메소드를 구현함으로써  클래스에 맞는 올바른 copy 되도록   있다.


  다음은 <NSCopying> adopt하여 deep copy 되도록 하는 Engine, Tire, Car 클래스의 copyWithZone 메소드 구현이다.@interface 부분은 생략하겠다.


    @implementation Engine


    - (id) copyWithZone: (NSZone*) zone

    {

        /* allocWithZone 메소드는 NSObject 클래스의 class method로서

         * 해당 클래스의 새로운 객체를 생성한다.

         * 객체 자신이 아닌 [self class] 사용함으로써 

         * subclass 역시 [super copyWithZone] 호출하여 copy 사용할  있다. */

        // Engine instance variable 가지지 않으므로 instance variable copy 과정 없이

        // 바로 init으로 초기화하면 된다.

        Engine* engineCopy = [[[self classallocWithZone:zone] init];

        return engineCopy;

    }


    @end


    @implementation Tire


    - (id) copyWithZone: (NSZone*) zone

    {

        Tire* tireCopy = [[[self classallocWithZone: zone]

                          initWithPressure: pressure treadDepth: treadDepth];

        return tireCopy;

    }


    @end


    @implementation Car


    - (id) copyWithZone: (NSZone*) zone

    {

        Car *carCopy = [[[self classallocWithZone: zone] init];

        

        carCopy.name = self.name;

        

        // engineCopy copy 의해 생성된 것이므로 memory management rule 의하여 release까지 책임을 져야 한다.

        // 여기에서는 autorelease 걸어주었다.

        Engine* engineCopy = [[engine copyautorelease];

        carCopy.engine = engineCopy;

        

        int i;

        for(i = 0; i < 4; i++)

        {

            Tire* tireCopy = [[self tireAtIndex: i] copy];

            // tire역시 copy 생성되었으므로 autorelease 걸어준다.

            [tireCopy autorelease];

            

            [carCopy setTire:tireCopy atIndex:i];

        }

        

        return carCopy;

    }


    @end




  앞서 id 타입은 어떠한 object 가리킬  있는 generic 타입이라고 설명하였다다음과 같이 id protocol 붙여줌으로써 protocol 만족하는 object들만을 가리키게   있다.


    - (void) setObjectValue: (id<NSCopying>) obj;



  Objective-C 2.0 이후부터는 protocol 선언에 @optional @required라는 modifier 추가되었다@optional  구현하지 않아도 괜찮은 메소드들을 나타내고( 장에서 설명한 informal protocol처럼), @required 기존의 protocol 선언된 메소드들처럼  구현되어야 하는 메소드들을 나타낸다


    @protocol BaseballPlayer


    - (void) slideHome;

    - (void) catchBall;

    - (void) throwBall;


    @optional

    - (void) drawHugeSalary;


    @required

    - (void) swingBat;


    @end




Reference

[1] Dalrymple. M., Learn Objective-C on the Mac, Apress.



저작자 표시
신고
posted by By훈트 2010.12.30 10:28
UIview
- 아이폰 화면에 보여지는 대부분은 View
 색, 그림, 버튼들을 가질 수 있다
- 드래그, 크기 조정,  등이 가능
- UIView는 GUI를 구성하는 단위 블록
- UIWindow는  UIView
01.//parentView(상위뷰)에 childView(하위뷰) 추가
02.[parentView addSubview:childView];
03. 
04.//parentView(상위뷰)가 가진 하위뷰들의 배열을 가져오기 (가장 뒤부터 가장 앞까지)
05.[parentView subview];
06. 
07.//childView(하위뷰)를 자신이 속한 상위뷰로부터 제거
08.[childView removeFromSuperview];
09. 
10.//i번째에 있는 하위뷰를 j번째에 있는 하위뷰와 순서를 바꿈
11.[parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j];
12. 
13.//View의 투명도 조정 (value값은 0.0[완전투명]부터 1.0[완전불투명]까지)
14.[myView setAlpha:0.5];
15. 
16.//뷰의 배경색 지정
17.[myView setBackgroundColor:[UIColor redColor]];


CGPoint
- 포인트는  y 좌표로 정의된 위치를 말한다.
1.//x, y의 CGPoint를 생성한다.
2.CGPointMake(x, y);
3. 
4.//CGPoint를 문자열로 변환한다.
5.NSStringFromCGPoint(someCGPoint);
6. 
7.//문자열을 CGPoint로 변환한다.
8.CGPointFromString(aString);
 

CGSize
- 폭과 높이를 가지는 구조체
1.//width, height의 CGSize를 생성한다.
2.CGSizeMake(width, height);
3. 
4.//CGSize를 문자열로 변환한다.
5.NSStringFromCGSize(someCGSize);
6. 
7.//문자열을 CGSzie로 변환한다.
8.CGSizeFromString(aString);

 
CGRect
- 모든 View는 경계를  데 프레임을 사용한다.
- 프레임은 뷰의 위치, 폭, 높이와 같은  지정한다.
- 코어 그래픽 구조를 사용하여 프레임 직사각형을 정의한다.
 보통 시작점(CGPoint)과 크기(CGSize)로 구성된다.
01.//직사각형 정의
02.CGRectMake(origin.x, origin.y, size.width, size,height);
03. 
04.//CGRect 구조체를 특정 형식을 가진 문자열로 변환한다.
05.NSStringFromCGRect(someCGRect);
06. 
07.//위의 코드로 변환된 특정 형식을 가진 문자열을 CGRect구조체로 복구한다.
08.CGRectFromString(aString);
09. 
10.//직사각형의 위치에서 직사각형의 크기만큼 외곽을 잘라내거나 덧붙인 가운데 정렬된 직사각형을 만든다. 양수로는 잘라내고 음수로는 덧붙여 만들게 된다.
11.CGRectInset(aRect);
12. 
13.//직사각형 구조체 rect1과 rect2가 겹치는지 알 수 있다.
14.CGRectIntersectsRect(rect1, rect2);
15. 
16.//(0,0)에 가로, 세로 길이가 0인 직사각형 상수
17.CGRectZero;



Reference :  iPhone Developer's Cookbook - Erica Sadun

저작자 표시
신고
posted by By훈트 2010.12.29 17:42

[Objective-C]NSArray, NSMutableArray객체

[Objective-C] 2009/01/05 14:15
NSArray는 다른 객체 포인터들의 목록이다.

- 자주 사용되는 메소드
- (unsigned)count -> 현재 배열의 객체의 수를 리턴한다.
- (id)objectAtIndex:(unsigned)i -> i번째 위치한 객체를 리턴한다.
- (id)lastObject -> 현재 배열의 맨 마지막 객체를 리턴한다.
- (BOOL)containsObject:(id)anObject -> 현재의 배열에 anObject오브젝트를 포함하면 YES 아니면 NO
- (unsigned)indexOfObject:(id)anObject -> 리시버에서 anObject가 있는지 가장 낮은 색인부터 검색하  여 배열의 색인 값을 리턴한다. 찾지 못하면 NSNotFound를 리턴한다.

- NSMutableArray는 NSArray를 상속받았지만 객체를 삽입하고 삭제할 수 있도록 확장되었다.

자주 사용되는 메소드

             - (void)addObject:(id)anObject -> anObject를 리시버의 끝에 삽입한다. nil배열은 넣을 수 없다.

 - (void)addObjectsFromArray:(NSArray *)otherArray ->

 - (void)insertObject:(id)anObject atIndex:(unsigned)index -> 

             - (void)removeAllObjects -> 리시버에 포함된 모든객체를 제거한다.
             - (void)removeObject:(id)anObject -> 리시버 배열 안의 anObject를 삭제한다.
             - (void)removeObjectAtIndex;(unsigned)index -> index의 객체를 제거한다.


[출처] 마음으로 보는 블로그

저작자 표시
신고
posted by By훈트 2010.12.14 17:56


object-c에서의 메모리 관리는 레퍼런스 카운트 (reference count)를 이용합니다.

모든 객체는 자신을 참조하는 수에 대한 내부 카운터를 가지고 있습니다.


-alloc : 해당 객체에 메모리를 할당하고 레퍼런스 카운트를 1 올립니다.

-retain : 해당 객체의 레퍼런스 카운트를 1 올립니다.

-copy : 해당 객체의 복사본을 만듭니다. 그리고 복사본의 레퍼런스 카운트를 1 올립니다.

-release : 해당 객체의 레퍼런스 카운트를 1 낮춥니다.

-autorelease : 정해지지 않은 시점에 해당 객체의 레퍼런스 카운트가 -1 낮아집니다.


규칙

1. 블록 내에서 alloc, retain, copy의 수와 release, autorelease 수가 동일해야 합니다.

2. factory 함수를 사용해 생성한 객체의 경우는 대부분 autorelease로 반환됩니다. 따로 release를 할 필요가 없습니다.

3. 클래스의 인스턴스 변수들은 dealloc 메소드에서 다 release해야 합니다.


예1. dealloc


- (void) dealloc

{

[vid release];

[title release];

}


예2. 로컬블록


{

NSString *name = [[NSString alloc] initWithString:@"Dreaming"];

NSString *co = [NSString stringWithString:"daum"];

NSString *book = @"iPhone Book";


//alloc만 release하면 됩니다.

[name release];

}


예3. autorelease 블록지정 : 해당블록의 autorelease메시지를 받은 객체들은 autorelease가 release되자마자 메모리에서 사라집니다.


NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

~~~

~~~

~~~

[pool release];


예4. 다양한 예


-(void) resetTitle

{

//alloc으로 인해 1 올라감

NSString *newTitle = [[NSString alloc] initWithString:@"A"];

[self setTitle:newTitle];    //접근자 사용

[newTitle release];         //메모리에서 제거

}


-(void) resetTitle

{

//factory함수로 autorelease가 됨, release할 필요 없음.

NSString *newTitle = [NSString stringWithString:@"A"];

[self setTitle:newTitle];      //접근자사용

}


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [NSNumber numberWithInt:i];

[array addObject:n];

}


NSNumber인 n을 생성했고 autorelease 메시지를 받아 언젠가 레퍼런스 카운트가 0으로 되어 사라질 것 같습니다만, 배열에 추가하는 addObject는 받는 인자를 바로 retain합니다. 그러니 한시적으로 레퍼런스 카운트가 2가 됩니다만 pool이 비워질 때 1이 되고, 배열이 사라질때 0이 됩니다.


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [[NSNumber alloc] initWithInt:i];

[array addObject:n];

[n release];

}


[출처]새카만곰돌이님의 블로그

저작자 표시
신고