* selector
- 오브젝티브 C에서 C 언어의 함수 포인터나 다른 언어에서의 delegate에 해당하는 기능
- 다형성을 구현하기 위해서 사용.
- 메소드를 실행시 동적으로 결정하기 위한 개념. 이 때문에 없는 매개변수를 참조하거나 하면 에러 메시지를 발생시키는 것이 아니라, 실행하고 나서야 변수를 찾아보고 없으면 바로 튕겨 버린다
- 자료형일 때에는 SEL
- 대입할 때에는 @selector(메소드명)으로 메소드의 주소를 리턴받아서 대입시킴
- 매개변수가 있을 때에는 @selector(메소드명:) <-- 콜론이 붙는 것에 주의
- 셀렉터에 지정되는 메소드는 반드시 매개변수가 객체여야 한다.
-(void)Disp; <- 가능
-(void)Disp:(id)sender; <- 가능
-(void)Disp:(int)n; <- 불가능
- 사용예
[ 객체 performSelector : (SEL) 변수];
SEL dele;
if(조건)
dele = Disp;
else
dele = Print;
[객체 performSelector : dele];
[객체 addTarget : delegate action : @selector(메소드)];
* 다형성 구현에 대한 개념
if(sel == 1)
dele = @selector(Disp);
else
dele = @selector(Print);
[Obj performSelector : dele];
- 위 소스에서 sel 이 1이라면 Disp를, 아니라면 Print를 수행한다
- 이와 같이 아래의 한 문장이 여러 가지 기능을 수행할 수 있도록 하기 위해 다형성을 구현한다
- 보통의 C 에서는 오버라이딩을 통해 다형성을 구현하지만 이것은 상속받지 않으면 사용할 수 없다는 단점이 있다
- 그 때문에 오브젝티브 C에서 새로 도입된 개념이 selector 이다
@interface Test:NSObject
-void(Disp);
@end
@implements Test
-void(Disp)
{
NSLog(@"Hello");
}
@end
int main()
{
Test * Obj = [Test new];
[Obj Disp];
if([Obj respondsToSelector : @selector[Disp)] == YES)
[Obj Disp];
else
{예외 발생};
return 0;
- Disp라는 함수가 구현이 되어 있을 경우는 문제가 없지만 위와 같이 코딩을 해두면 Disp가 없어서 예외가 발생했을 경우에 대한 처리가 가능해진다
- 기본적으로 여러 사람에 의한 공동 작업을 상정해 만들어진 기능이라고 생각하면 된다
* 카테고리
- 클래스의 기능을 확장하기 위해 일부 메소드를 구현한 모듈을 말한다 . 사용자 정의 클래스나 프레임워크가 제공하는 클래스의 기능을 확장하고 싶을 때에 사용한다(즉 기본 SDK에서 제공되는, 사용자가 마음대로 고칠 수 없는 것들을 좀 편하게 사용할 때에 주로 사용한다)
- 기존 클래스의 정의를 변경하지 않은 상태에서 원하는 메소드만 추가하여 사용할 수 있다
- 인스턴스 변수의 선언은 할 수 없다(할당받는 메모리의 사이즈가 달라져 버리므로)
- 기본적으로 원래의 클래스를 import로 가져온 뒤 별도의 소스 파일을 하나 추가해서 두개를 더한 클래스를 만들어 버리는 방식이다
* 프로토콜
- 아이폰 SDK의 프로토콜 이름은 거의 대부분 사용자가 유추할 수 있다
<클래스명 Delegate>
<클래스명 Datasource>
- Did나 Will로 시작되는 것들도 많다
- 어떤 메소드를 사용해야 하는지를 프로토콜 이름을 보고 추정하여 찾아가는 습관을 갖는 것이 좋다
- 프로토콜 적용
@interface 클래스명 : 슈퍼클래스명<프로토콜 이름>
- 프로토콜도 상속이 가능하며, 콤마로 구분하여 여러개를 붙여서 다중 상속도 가능하다
* 인스턴스와 매개변수의 제약
- 인스턴스 변수 선언시 오브젝티브 C는 id 타입으로 선언하면 아무 제약 없이 모든 클래스의 인스턴스를 생성할 수 있다
- 이 때 생성되는 인스턴스에 제약을 가하고자 하는 경우에도 프로토콜을 사용할 수 있다. 이렇게 되면 동적이 아니라 정적으로 타입을 점검하게 된다
* 프로토콜의 선택/필수 구분
- 프로토콜에 선언되는 메소드 앞에 @optional을 적으면 메소드를 구현해도 되고 안해도 된다
- @required라고 쓰면 반드시 구현해야 한다
* NSObject
- 최상위 클래스로서 모든 클래스는 여기에서 상속받아 사용해야 한다. 그렇지 않으면 인스턴스를 만들 수 없다
* 메모리 생성과 해제
self = [super init]; // <-- 메모리를 초기화
if(self != nil) // <-- 초기화가 잘 되었는지 확인
{
처리내용
}
return self;
- 굉장히 정형화된 표현으로서 거의 대부분 저런식으로 이루어진다
- 유저는 거의 처리 내용만을 입력하게 된다
UIButton * button = [[UIButton alloc]init];
버튼 사용
release
- 직접 코딩으로 버튼을 만드는 경우. 이 경우는 메모리 할당과 초기화 한번으로 끝난다
IBOutlet UIbutton *button
버튼 사용
[[UIbutton alloc]init]retain]
button release
- 인터페이스 빌더로 만들고 나면 IBOutlet으로 들어가게 되는데, 이 경우는 메모리를 할당한 뒤 그것을 복사하여 2개가 된다. 다 사용하고 뷰를 없앴을 때에는 아래쪽에서 retain 문으로 retain Count가 1 감소하게 되지만 원래의 하나는 남아 있기 때문에 메모리 누수의 원인이 된다. 이런 식으로 했을 때는 반드시 button release를 한번 더 해줘야 한다.
* iPhone SDK
- 프로젝트 만들 때에 Navigation Based는 주소록 기반이라는 뜻
- OpenGL ES : 그래픽 처리 관련
- Split View Based : 아이패드용
- Tab Bar : 보통 잘 안쓴다. Tab bar는 Navigation Based를 포함할 수 있지만 반대는 안된다.
- Utility : 주식효과 같은 프로그램에 사용. 화면이 앞뒤로 뒤집어지는 처리를 기본으로 함. 모양새일 뿐 별로 의미는 없다.
- View Based : 기본적인 화면 하나를 두고 거기에서 처리하는 프로그램.
- Window Based : 창 하나를 띄우고 거기에 추가하여 만드는 프로그램. 가장 추천이 되고 기본이 되는 타입.
* 프로젝트 설정 후 왼쪽 폴더
- Classes : 가장 많이 코딩하게 되는 곳.
- Other Sources : 프로젝트 실행에 관련된 파일들이 존재
- Resources : 각종 그래픽이나 사운드 등의 외부 자원들이 등록되는 곳.
XIB 파일 : 화면처리와 디자인에 관한 것들
plist :
- Frameworks : 참조해야 하는 헤더 파일들의 모음
UIKit
Foundation
CoreGraphics
위 3가지 이외에도 필요에 따라 필요한 프레임워크를 링크하여 사용할 수 있다.
- Products : 유저가 만드는 앱이 등록되는 곳.
* 인터페이스 빌더
- Library : 끌어다 놓음으로서 만들 수 있는 것들.
view에 끌어다 놓아서 화면의 디자인을 할 수 있는 것들이 있고, xib 파일에 끌어다 놓는 컨트롤과 같은 것들도 있다.
- Inspector : 설정창. 아주 중요하다.
Attributes : 각종 속성을 설정한다
Connections : View상에 배치된 객체와 연결시켜서 속성을 설정
Size : 객체의 위치와 크기 등의 설정
Class : 객체의 제어권 설정
- 하나의 작업이 끝나면 인터페이스 빌더는 바로 저장하고 꼭꼭 닫아주는 버릇을 들이는 것이 좋다. 창이 계속해서 새로 떠 버리기 때문에 헷갈리게 된다.
* 아이폰 시뮬레이터
- 그냥 Run 하면 나온다(...)
- 프로젝트를 하나씩 지우는 것은 실제 아이폰에서 하듯이 하면 됨
(아이콘 오래 클릭)
- 화면 회전은 Command + 방향키
- 멀티 터치는 Option + 마우스 드래그
- 왼쪽 위의 버전은 대개 시뮬레이터로 세팅. 3.2는 아이패드용이므로 쓰지말자(...)
* 외부와 연결시 변수는 IBOutlet으로, 액션은 IBAction으로 연결되어야 한다.
'프로그래밍 > Objective-C' 카테고리의 다른 글
중앙정보학원 아이폰과정 6일차 - 2010년 7월 12일 (0) | 2010.07.12 |
---|---|
중앙정보학원 아이폰과정 5일차 - 2010년 7월 9일 (0) | 2010.07.09 |
중앙정보학원 아이폰과정 3일차 - 2010년 7월 7일 (0) | 2010.07.07 |
중앙정보학원 아이폰과정 2일차 - 2010년 7월 6일 (0) | 2010.07.06 |
중앙정보학원 아이폰과정 1일차 - 2010년 7월 5일 (0) | 2010.07.05 |