iPhone Dev

아이폰 개발 정리 1

HyperMind 2010. 11. 7. 23:16

1. 프로젝트명 : PersonTest

 

2. Person    클래스

  : 변수명

    NSString *name;

    int age;

    NSString *address;

 

3. 2명의 정보 저장

    홍길동 19 장성

    이순신 45 전라

 

4. 데이터 출력

==> 클래스 정리

  1) 클래스명은 대문자. (Person)

  2) 클래스 구조

       - Person.h  (인스턴스 변수, 메소드 선언)

         => 인스턴스변수, 멤버변수, property

       - Person.m

         => 헤더 파일에서 구현된 메소드 구현

 

       * 클래스 용도

        => 데이터 저장,

        => 인스턴스변수에 데이터가 저장된다.

        => 인스턴스변수에 테이터를 저장, 수정, 검색하는 역할은 메소드가 처리한다.

        ==> 메소드 종류 1

             1) 데이터를 설정 (데이터를 저장, 수정)

                 : setter 메소드

                 : 메소드 명

                    ==> set 변수명 (변수명의 첫글자는 대문자)

             2) 데이터를 얻기 (데이터를 검색)

                 : getter 메소드

                    ==> get변수명 (X)

                    ==> 변수명 (O)

       ==> 메소드 종류 2

             1) 인스턴스 메소드

                : -

                : alloc 후에 변수명으로 호출한다.

                : 객체생성한 갯수만큼 메소드가 생성

             2) 클래스 메소드   ->  거의 안쓴다.

                : +

                : 호출시 클래스이름으로 호출한다.

                : 단 한번 생성

 

 * 객체 생성

   : 클래스를 메모리에 올리는 작업 ( alloc + init )  ->  메모리 공간할당 / 초기화

           Person *p = [[Person alloc] init];

 

           alloc : +, 클래스메소스

           init : -,  인스턴스메소스

 

 * 클래스 생성방법1

    1) 인스턴스변수 선언

    2) 인스턴스 메소스 선언

        : getter, setter

    3) 인스턴스 메소스 구현

    4)  자원 반납

 

 * 클래스 생성 방법2

    1) 인스턴스변수 선언

    2) @property 지시자 사용

         : nonatomic ==>  멀티스레드 (공유하겠다는 의미)  성능으나 무결성 낮음

         : 메모리 관련

            - retain

            - copy

            - assign : (디폴트) 기본데이터에서만 사용 가능

    3) @synthesize

    4)  자원 반납

 

* 메모리

  - 애플의 메모리 관련

    1)  Garbage Collector

        : 메모리 관리를 시스템이 자동으로 관리 해줌

        : OS

    2) reference Counting

        : 개발자가 명식적으로 메모리 관리

        : 아이폰

         * 메커니즘

          1) 메모리를 할당 받으면 자동으로  count 값이 1 증가

              - alloc 한 경우

              - copy 한 경우

              - retain 한 경우

              - new (alloc + init) 한 경우

 

        * 1)을 한 사용자가 반드시 release할 의무가 있다.

 

     * assign count 값이 증가 안됨.

 

         2) 메모리 count값을 1 감소

             (메모리 해제, free : count 값이 0인 경우에 dealloc 메소드를 호출해서 해제시킨다.)

              - release 한 경우

              - autorelease 한 경우

                 : release를 연기하는 방식

               * NSAutoreleasePool 클래스를 이용한다.

                 : 용도

               ==> 메소드내에서 임시적으로 사용되는 객체(클래스)

 

 

* 클래스 구성요소

   1) 인스턴스 변수

   2) 메소드

   3) initializer (초기화자) : 생성자

      : init메소드

      : NSObject init

      : 용도

       ==> 인스턴스 변수 초기화 (처음 값 할당)

       ==> setter 는 값을 변경하는 역할

      : initializer의 오버라이딩

       -(id) init {

           

           if( self = [super init]) {

                // 작업 …

           }

           return self;

        }

 

        ==> initXXXX 형태의 이름을 사용한다.

 

 * objective-C  애플문서

   http://developer.apple.com 에서 objective 로 검색

 

* 상속

  - 최상위 클래스 : NSObject

  - 특징

     : 부모클래스의 모든 멤버(변수,메소드)를 그냥 사용 가능하다.

  - 오버라이딩

     : 부모의 메소드를 수정해서 사용한 경우.

 

* 케테고리 (category)

     : 용도

     ==> 메소드를 확장시키는 용도로 사용한다.

     : 특징

     ==> 기존 클래스를수정하지 않고 메소드를 추가 가능

 

* 프로토콜 (protocol)

   : 용도

    ==> 하위 클래스에게 특정 메소드를 강제할 목적으로 사용.

   : 문법

     @protocol 프로토콜명

         // 강제할 메소드 선언

     @end

    ==> 하위 클래스에서 프로토콜을 사용 가능

            (confirm한다하고함) : 프로토콜의 메소드를 반드시 구현해야 한다

    : 2가지 지시자

     @required

       ==> 강제적

       ==> default

     @optional

       ==> 선택적

   : 종류

      1) formal protocol

          : @protocol 지시자를 이용해서 만든 일반적인 프로토콜 의미

 

      2) informal protocol

          : 카테고리를 의미

          : 기준이 되는 클래스가  NSObject (Base NSObject 인 프로토콜)

         ==> NSKeyValueCoding 프로토콜이 대표적

         ==> NSKeyObserving 프로토콜이 대표적

 

* NSKeyValueCoding 패턴

   : key/value 쌍으로 저장가능한 클래스

  ==> NSDictionary

   : 일반적인 클래스도  NSDictionary처럼 key/value쌍으로 사용 가능한 방법을 의미한다.

   : 특징

     ==> setter, getter  메소드가 불필요하다.

 

* NSKeyValueObserving  패턴

   : NSKeyValueCoding 이용한 값 변경시 이벤트 처리 가능

 

* Foundation class (Foundation 프레임워크)

   : NSXXX 클래스들을 의미

   : Foundation Framework Reference 문서 참조

 

   - 문자열

      : NSString (수정 불가)

      : NSMutableString (수정 가능)

      => 상속관계

      => 메소드를 정리

 

   - 숫자

      : NSNumber

      => 메소드를 정리

 

   - 날짜

      : NSDate, NSCalendar

     => 메소드 정리

 

***** Data Formatting Guide 참조

 

    - 컬렉션 관련 (대량 데이터 저장)

       1) NSArray, NSMutableArray

          : 배열

          : 순서가 있다.

          : 중복 허용 

          : 데이터만 저장

       2) NSSet, NSMutableSet

          : 순서가 없다.

          : 중복 허용 불가

          : 데이터만 저장

       3) NSDictionary, NSMutableDictionary 

           : key/value 쌍으로 저장

           : key를 이용해서 데이터를 얻는다. (검색이 용이)

 

 

** 프레임워크

    1) 코코아 프레임워크

        : Foundation 프레임워크 + AppKit 프레임워크

        ==> 맥 개발

    2) 코코아 터치 프레임워크

        : Foundation 프레임워크 + UIKit 프레임워크

       ==>  아이폰 개발

 

* 지속성 데이터 관리 (Persistence Data Management)

   : 4 가지 방법 (모두 파일 형태)

 

   1) 파일에 저장

     => *.plist (property list 파일)

     => 7가지 타입만 저장 가능

        - NSArray

        - NSDictionary

        - NSData

      - NSDate

      - NSNumber  

        - BOOL

  

    2) 아카이빙 (Archiving)

        => '객체직렬화' 방식

        => 모든 클래스를 저장. (인스턴스)

        => 전제조건

          : NSCoding 프로토콜을 반드시 준수해야 한다.

              : - (void)encodeWithCoder:(NSCoder *)encoder

       :- (id)initWithCoder:(NSCoder *)decoder

          : 애플에서 제공하는 Foundation 클래스들은 대부분이 NSCoding 프로토콜을 준수한다.

              ==> 파일에 저장 가능하다.

 

    3) 데이터 베이스

      : 경량의 데이터베이스인 'SQLite' 사용

     http://www.sqlite.org

      : 소규모의 장치에 주로 사용된다.

      : C 기반,

      : 파일로 저장

 

      클래스 <---------------->  SQLite 데이터베이스

    (오브젝티브C 기반)                ( C기반 )

 

    4) 코어 데이터 (Core Data Framework)

      : 파일로 저장

      : 아키텍쳐

 

      클래스 <---------> Core Data Framework <------>  SQLite 데이터베이스, 일반 파일, 메모리

    (오브젝티브C 기반)        (오브젝티브C 기반)                      ( C기반 )

 

      http://developer.apple.com  -> core data로 검색해서 튜터리얼 볼것

      책 추천 : 모어 아이폰3 프로그래밍   (위키북스 임베디드 & 모바일 프로그래밍)

 

* NSCopying 프로토콜

   : copy와 관련

   : 메소드 (copy, mutableCopy)

   : 전제조건

      => NSCopying 프로토콜 준수

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

 

   ** Zone

   - alloc, allocWithZone

 

   : 종류

    1) 얕은 복사(Shallow copy)

     ==> assign

     ==> 카운트 증가 없다.

    2) 깊은 복사 (deep copy)

    => copy, mutableCopy

    => 카운트값이 증가 ==> 반드시 release 해야 된다.