아이폰 개발 정리 1
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 해야 된다.