SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
Objective-C Runtime
Programming Guide
리나소프트 김 성 관
13년	 5월	 21일	 화
✓ Objective-C 언어는 runtime 시에 많은 결정을 함.
✓ 컴파일된 코드를 실행하기 위해서는 컴파일러 뿐만
아니라 Runtime System이 필요함.
✓ Runtime System은 일종의 OS와 같이 동작.
- Objective-C 프로그램이 어떻게 runtime system과 상호작용하는지.
- 런타임시에 새로은 클래스를 어떻게 동적으로 로딩하는지.
- 다른 객체에게 어떻게 메시지를 전달하는지.
- 프로그램이 실행중인 동안 어떻게 객체에 대한 정보를 찾는지.
13년	 5월	 21일	 화
Interacting with the Runtime
Objective-C 프로그램은 3가지 레벨에서 런타임 시스템과 상호작용
1. Objective-C Source Code
2. NSObject Methods
3. Runtime Functions
13년	 5월	 21일	 화
ClassC의 객체
obj isa
stack Heap
Code
ClassC
-methodC
super
ClassB
-methodB
ClassA
super
-methodA
NSObject
super
NSNumber
-methodX +alloc
NSNumber의 객체
num
isa
super
-init -init
+alloc
객체 생성 과정
13년	 5월	 21일	 화
Interacting with the Runtime
1. Objective-C Source Code
✓ 런타임 시스템의 동작은 보이지 않는 곳에서 자동으로 동작
✓ Objective-C 소스코드를 작성하고 컴파일하게 되면 런타임 시스템을 간접적으로
사용
✓ 코드를 컴파일 하게 되면 data structure와 언어의 동적인 특성을 구현한 함수
호출을 만들어 냄
✓ Data Structure
- Class와 Category 정의, Protocol 선언 정보
- method selector, instance variable templates, 그리고 소스 코드에서 추출된
다른 정보 등
13년	 5월	 21일	 화
Interacting with the Runtime
2. NSObject Methods
✓ Cocoa에서 대부분의 객체는 NSObject 클래스의 서브클래스
✓ 몇몇 메소드는 런타임 시스템에 간단한 질의 수행
- 객체가 자신의 내부 정보를 획득(introspection)
- class
- isKindOfClass: , isMemberOfClass
- respondsToSelectors:
- conformsToProtocol:
- methodForSelectors:
13년	 5월	 21일	 화
Interacting with the Runtime
3. Runtime Functions
✓ /usr/include/objc 에 있는 헤더 파일내의 데이터 구조나 함수의 조합
✓ 순수 C로 작성
✓ Objective-C 프로그래밍에는 필요하지 않음
✓ 런타임 시스템 인터페이스를 개발할 때 사용
13년	 5월	 21일	 화
Messaging
Objective-C에서 메시지는 런타임까지 구현부에 바인딩 되지 않는다.
[receiver message] objc_msgSend(receiver, selector)
objc_msgSend(receiver, selector, arg1, arg2, ...)
✓ objc_msgSend(messaging function) 함수가 동적 바인딩에 필요한
모든 것을 수행.
- selector가 참조하는 procedure(method implementation)를 찾는다.
- 같은 함수가 다른 클래스에서 다르게 구현되어 있을 수 있기 때문에 정확한
procedure를 찾는 것은 receiver의 클래스에 달려있다.
- receiving object에 데이터 포인터 전달, procedure 호출.
- 처리 값 반환
✓ objc_msgSend 함수를 코드에서 직접 호출하면 안 됨!
13년	 5월	 21일	 화
Messaging
‣ 모든 클래스 객체는 다음 두 가지 항목을 포함하고 있다.
✓ superclass에 대한 포인터
✓ class dispatch table
- selector와 함수 구현부의 주소를 연결
‣ 새로운 객체가 생성될 때 할당된 메모리와 인스턴스 변수들 초기화
‣ 객체의 변수들 중 첫번째는 클래스 구조에 대한 포인터
- isa 라고 부르를 포인터
- 클래스 자체와 클래스가 상속받은 모든 클래스에 대한 접근이 가능
- isa 포인터는 언어의 일부분이 아니지만, 런타임 시스템에서 동작하기 위해 필요
13년	 5월	 21일	 화
Messaging
함수가 동적으로 메소드에 바인딩
되는 과정
메시지가 객체에 전달
isa 포인터를 참조
dispatch table 검색
superclass 포인터를 참조
dispatch table 검색
cache 검색(MRU)
13년	 5월	 21일	 화
Using Hidden Arguments
✓ objc_msgSend가 procedure를 찾으면 호출하고, 메시지 내의 모든 인자를 전달
✓ 두개의 숨은 인자
- receiver
- selector
✓ 메소드를 정의한 코드에 선언되어 있지 않기 때문에 “hidden argument”
✓ 코드가 컴파일 될 때 삽입
✓ 메소드는 수신 객체를 self로, 자신에 대한 selector를 _cmd로 참조
13년	 5월	 21일	 화
Using Hidden Arguments
- strange
{
id target = getTheReceiver();
SEL method = getTheMethod();
if ( target == self || method == _cmd )
return nil;
return [target performSelector:method];
}
13년	 5월	 21일	 화
Getting a Method Address
✓ 동적 바인딩을 회피하는 유일한 방법은 메소드의 주소를 얻어서 마치 함수인 것
처럼 직업 호출하는 방법
- 특정 메소드가 많은 횟수 반복적으로 사용될 때 매번 메시징 하는 오버헤드를 피하고 싶을 때
사용
✓ NSObject 클래스에 정의된 methodForSelector 사용
- procedure의 포인터 조회
- 포인터를 사용하여 procedure 호출
- 포인터는 알맞은 함수 타입으로 형변환 해야 함!
void (*setter)(id, SEL, BOOL);
int i;
setter = (void (*)(id, SEL, BOOL))[target methodForSelector:@selector(setFilled:)]; 
for ( i = 0; i < 1000; i++ )
setter(targetList[i], @selector(setFilled:), YES);
13년	 5월	 21일	 화
Getting a Method Address
@interface MyClass : NSObject {
}
-(void)doSomething;
@end
@implementation MyClass 
-(void) doSomething {
// Do many many work
}
@end
MyClass* myObject = [ [ MyClass alloc ] init ] ;
SEL method = @selector(doSomething) ;
IMP func = [ myObject methodForSelector:method ] ;
func( myObject, method );
13년	 5월	 21일	 화
Dynamic Method Resolution
✓ 동적으로 메소드를 제공해야할 경우가 종종 있다.(?)
- @dynamic propertyName;
- resolveInstanceMethod:
- resolveClassMethod:
- 주어진 selector에 대한 구현을 동적으로 제공
✓ Objective-C 메소드는 최소한 두개의 인자(self, _cmd)를 갖는 C 함수
✓ class_addMethod 함수를 사용하여 클래스에 함수를 메소드로 추가할 수 있음.
✓ Forwarding 메소드 또는 dynamic method resolution 둘 중 한가지 방법으로
동적 메소드 호출
✓ Forwarding 메커니즘을 시작하기 전에 dynamic method resolution 을 수행
13년	 5월	 21일	 화
Dynamic Method Resolution
void dynamicMethodMP(id self, SEL _cmd) {
// implementation …
}
@implementation MyClass
+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
if (aSEL == @selector(resolveThisMethodDynamically)) {
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP,“v@:”);
returnYES;
}
return [super resolveInstanceMethod:aSEL];
}
@end
13년	 5월	 21일	 화
Dynamic Loading
Objective-C 프로그램은 실행 중에 새로운 클래스와 카테고리를 로드하고 링크할 수
있다.
13년	 5월	 21일	 화
Message Forwarding
✓ 메시지 처리가 정의되어 있지 않은 객체에 메시지를 보내면 에러 발생
✓ 에러가 발생하기 전에 런타임 시스템은 메시지를 이해하고 있는 곳으로 메시지를
전달
==> Message Forwarding
✓ NSInvocation 객체를 단일 인자로 하는 forwardInvocation 메시지 전달
-(void)forwardInvocation:(NSInvocation *) anInvocation
✓ 이 메소드는 NSObject에서 정의되어 있기 때문에 모든 객체에 사용할 수 있음.
✓ NSInvocation객체에는 target, selector, parameter 같이 메세지 송신에 필요한 모든
정보가 들어있음.
13년	 5월	 21일	 화
Message Forwarding
- negotiate {
if ( [someOtherObject respondsTo:@selector(negotiate)] )
return [someOtherObject negotiate];
return self;
}
13년	 5월	 21일	 화
Message Forwarding
- (void)forwardInvocation:(NSInvocation *)anInvocation {
if ([someOtherObject respondsToSelector: [anInvocation selector]])
[anInvocation invokeWithTarget:someOtherObject];
else
[super forwardInvocation:anInvocation];
}
- 동적인 방법으로 메시지 전달
- 메시지 내의 selector와 일치하는 메소드가 없을 때 호출
- 원래 인자들과 함께 전달할 곳으로 보내야 함
- 전달된 메시지의 리턴값은 원래 호출자에게 돌아감
- 알 수 없는 메시지들을 서로 다른 수신자에게 배분하는 역할
(또는 모든 메시지를 같은 목적지로 보내는 역할)
- 객체에 전달한 메시지가 존재할 경우 forwardInvocation은 호출되지 않음
13년	 5월	 21일	 화
Forwarding and Multiple Inheritance
✓ 포워딩은 다중 상속의 효과를 주는데 사용할 수 있다.
(다중 상속에서 원하는 대부분의 기능을 제공)
✓ 메시지를 전달하는 객체는 receiver가 메시지를 처리하는 것 처럼 보이며,
값을 리턴 받는다.
13년	 5월	 21일	 화
Surrogate Object
✓ 다른 객체를 대신하고 메시지를 전달해주는 역할
✓ 크고, 무거운 동작을 수행하는 객체의 앞단에서 동작하는 객체
(경량 객체)
✓ 데이터에 관한 질의와 같은 간단한 처리는 직접 수행하고, 무거운 처리가 필요할
경우 실제 처리 객체에게 메시지 전달
✓ 커다란 객체로 향하는 모든 메시지는 surrogate를 통하게 되고, 다른 객체들은 두
객체를 동일하게 보게 됨
13년	 5월	 21일	 화
Forwarding and Inheritance
✓ 포워딩이 상속과 유사하게 보일지라도, respondsToSelector: , isKindOfClass: 같은
메소드는 forwarding chain을 고려하지 않는다.
✓ 만약 포워딩 객체가 실제 객체의 모든 행위를 상속 받은 것 처럼 사용하고 싶다면,
위 메소드를 오버라이딩 해야 한다.
(BOOL)respondsToSelector:(SEL)aSelector
{
if ( [super respondsToSelector:aSelector] ) returnYES;
else { /* 이 부분에 aSelector 메시지가  *
* 다른 객체로 전달될 수 있는지 그리고   *
* 해당 객체가 메시지에 응답할 수 있는지를 체크하고 *
* 그럴수 있다면YES를 되돌리는 코드를 넣는다.   */
}
return NO;
}
13년	 5월	 21일	 화
Forwarding and Inheritance
✓ instancesRespondToSelector: , conformsToProtocol: 메소드 등도 필요에 따라
반영해야 한다.
✓ 객체가 원격지에서 수신한 모든 메시지를 전달한다면,
methodSignatureForSelector: 메소드 구현해야 한다.
(NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature) {
signature = [surrogate methodSignatureForSelector:selector];
}
return signature;
}
13년	 5월	 21일	 화
class object
isa
Class Object
instance
variable
instance
method
table
metaclass object
isa
class
method
table
NSObject
13년	 5월	 21일	 화
13년	 5월	 21일	 화
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
struct objc_class {
Class isa;
Class super_class
const char *name
long version
long info
long instance_size
struct objc_ivar_list *ivars
struct objc_method_list **methodLists
struct objc_cache *cache
struct objc_protocol_list *protocols
}
runtime.h
typedef struct objc_method *Method;
struct objc_method {
SEL method_name
char *method_types
IMP method_imp
}
objc.h
13년	 5월	 21일	 화

Mais conteúdo relacionado

Mais procurados

Scala type class pattern
Scala type class patternScala type class pattern
Scala type class patternYong Joon Moon
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm엑셈
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해seungkyu park
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬Lee-Jong-Chan
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10hungrok
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계Lee-Jong-Chan
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http RequestNAVER D2
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apm엑셈
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm엑셈
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm엑셈
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 

Mais procurados (20)

Scala type class pattern
Scala type class patternScala type class pattern
Scala type class pattern
 
Class Loader_Wh apm
Class Loader_Wh apmClass Loader_Wh apm
Class Loader_Wh apm
 
Java inner class
Java inner classJava inner class
Java inner class
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
Java 기초
Java 기초Java 기초
Java 기초
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apm
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
Java extends
Java extendsJava extends
Java extends
 
IBM JVM GC_Wh apm
IBM JVM GC_Wh apmIBM JVM GC_Wh apm
IBM JVM GC_Wh apm
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 

Destaque

[UBhind Analytics]부동산앱 사용비교 분석
 [UBhind Analytics]부동산앱 사용비교 분석 [UBhind Analytics]부동산앱 사용비교 분석
[UBhind Analytics]부동산앱 사용비교 분석Sung-Kwan Kim
 
Introduction to Objective-C
Introduction to Objective-CIntroduction to Objective-C
Introduction to Objective-CHyeYeon Yim
 
[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법Theodore(Yongbin) Cha
 

Destaque (8)

[UBhind Analytics]부동산앱 사용비교 분석
 [UBhind Analytics]부동산앱 사용비교 분석 [UBhind Analytics]부동산앱 사용비교 분석
[UBhind Analytics]부동산앱 사용비교 분석
 
구성(Composition)
구성(Composition)구성(Composition)
구성(Composition)
 
Introduction to Objective-C
Introduction to Objective-CIntroduction to Objective-C
Introduction to Objective-C
 
프로젝트 구성
프로젝트 구성프로젝트 구성
프로젝트 구성
 
I os 1
I os 1I os 1
I os 1
 
[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법[Objective-C] Objective-C의 메모리 관리 방법
[Objective-C] Objective-C의 메모리 관리 방법
 
FoundationKit
FoundationKitFoundationKit
FoundationKit
 
sungmin slide
sungmin slidesungmin slide
sungmin slide
 

Semelhante a Objective-C Runtime Programming Guide

[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
Android Programming
Android ProgrammingAndroid Programming
Android ProgrammingJake Yoon
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - InputJake Yoon
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XpressEngine
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본용호 최
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해Dong Hyun Kim
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)Devgear
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)용호 최
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)YoungSu Son
 

Semelhante a Objective-C Runtime Programming Guide (20)

[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Android Programming
Android ProgrammingAndroid Programming
Android Programming
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - Input
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
Java script
Java scriptJava script
Java script
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Xe 구조에 대한 이해
Xe 구조에 대한 이해Xe 구조에 대한 이해
Xe 구조에 대한 이해
 
Xe hack
Xe hackXe hack
Xe hack
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Cygnus unit test
Cygnus unit testCygnus unit test
Cygnus unit test
 
프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)프로그래밍 언어 기초(델파이,C++)
프로그래밍 언어 기초(델파이,C++)
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
 

Mais de Sung-Kwan Kim

[UBhind Analytics]음악앱 사용비교 분석
 [UBhind Analytics]음악앱 사용비교 분석 [UBhind Analytics]음악앱 사용비교 분석
[UBhind Analytics]음악앱 사용비교 분석Sung-Kwan Kim
 
[UBhind Analytics]소개팅앱 사용비교 분석
[UBhind Analytics]소개팅앱 사용비교 분석[UBhind Analytics]소개팅앱 사용비교 분석
[UBhind Analytics]소개팅앱 사용비교 분석Sung-Kwan Kim
 
UBhind Analytics 서비스 소개
UBhind Analytics 서비스 소개UBhind Analytics 서비스 소개
UBhind Analytics 서비스 소개Sung-Kwan Kim
 
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석Sung-Kwan Kim
 
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트Sung-Kwan Kim
 
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트Sung-Kwan Kim
 
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트Sung-Kwan Kim
 

Mais de Sung-Kwan Kim (7)

[UBhind Analytics]음악앱 사용비교 분석
 [UBhind Analytics]음악앱 사용비교 분석 [UBhind Analytics]음악앱 사용비교 분석
[UBhind Analytics]음악앱 사용비교 분석
 
[UBhind Analytics]소개팅앱 사용비교 분석
[UBhind Analytics]소개팅앱 사용비교 분석[UBhind Analytics]소개팅앱 사용비교 분석
[UBhind Analytics]소개팅앱 사용비교 분석
 
UBhind Analytics 서비스 소개
UBhind Analytics 서비스 소개UBhind Analytics 서비스 소개
UBhind Analytics 서비스 소개
 
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석
[UBhind Analytics] 여행 및 지역정보 앱 사용성 분석
 
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 6월 3,4주 주요지표 리포트
 
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트
[UBhind Analytics] 2015 6월 1,2주 주요지표 리포트
 
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트
[UBhind Analytics] 2015 5월 3,4주 주요지표 리포트
 

Objective-C Runtime Programming Guide

  • 1. Objective-C Runtime Programming Guide 리나소프트 김 성 관 13년 5월 21일 화
  • 2. ✓ Objective-C 언어는 runtime 시에 많은 결정을 함. ✓ 컴파일된 코드를 실행하기 위해서는 컴파일러 뿐만 아니라 Runtime System이 필요함. ✓ Runtime System은 일종의 OS와 같이 동작. - Objective-C 프로그램이 어떻게 runtime system과 상호작용하는지. - 런타임시에 새로은 클래스를 어떻게 동적으로 로딩하는지. - 다른 객체에게 어떻게 메시지를 전달하는지. - 프로그램이 실행중인 동안 어떻게 객체에 대한 정보를 찾는지. 13년 5월 21일 화
  • 3. Interacting with the Runtime Objective-C 프로그램은 3가지 레벨에서 런타임 시스템과 상호작용 1. Objective-C Source Code 2. NSObject Methods 3. Runtime Functions 13년 5월 21일 화
  • 4. ClassC의 객체 obj isa stack Heap Code ClassC -methodC super ClassB -methodB ClassA super -methodA NSObject super NSNumber -methodX +alloc NSNumber의 객체 num isa super -init -init +alloc 객체 생성 과정 13년 5월 21일 화
  • 5. Interacting with the Runtime 1. Objective-C Source Code ✓ 런타임 시스템의 동작은 보이지 않는 곳에서 자동으로 동작 ✓ Objective-C 소스코드를 작성하고 컴파일하게 되면 런타임 시스템을 간접적으로 사용 ✓ 코드를 컴파일 하게 되면 data structure와 언어의 동적인 특성을 구현한 함수 호출을 만들어 냄 ✓ Data Structure - Class와 Category 정의, Protocol 선언 정보 - method selector, instance variable templates, 그리고 소스 코드에서 추출된 다른 정보 등 13년 5월 21일 화
  • 6. Interacting with the Runtime 2. NSObject Methods ✓ Cocoa에서 대부분의 객체는 NSObject 클래스의 서브클래스 ✓ 몇몇 메소드는 런타임 시스템에 간단한 질의 수행 - 객체가 자신의 내부 정보를 획득(introspection) - class - isKindOfClass: , isMemberOfClass - respondsToSelectors: - conformsToProtocol: - methodForSelectors: 13년 5월 21일 화
  • 7. Interacting with the Runtime 3. Runtime Functions ✓ /usr/include/objc 에 있는 헤더 파일내의 데이터 구조나 함수의 조합 ✓ 순수 C로 작성 ✓ Objective-C 프로그래밍에는 필요하지 않음 ✓ 런타임 시스템 인터페이스를 개발할 때 사용 13년 5월 21일 화
  • 8. Messaging Objective-C에서 메시지는 런타임까지 구현부에 바인딩 되지 않는다. [receiver message] objc_msgSend(receiver, selector) objc_msgSend(receiver, selector, arg1, arg2, ...) ✓ objc_msgSend(messaging function) 함수가 동적 바인딩에 필요한 모든 것을 수행. - selector가 참조하는 procedure(method implementation)를 찾는다. - 같은 함수가 다른 클래스에서 다르게 구현되어 있을 수 있기 때문에 정확한 procedure를 찾는 것은 receiver의 클래스에 달려있다. - receiving object에 데이터 포인터 전달, procedure 호출. - 처리 값 반환 ✓ objc_msgSend 함수를 코드에서 직접 호출하면 안 됨! 13년 5월 21일 화
  • 9. Messaging ‣ 모든 클래스 객체는 다음 두 가지 항목을 포함하고 있다. ✓ superclass에 대한 포인터 ✓ class dispatch table - selector와 함수 구현부의 주소를 연결 ‣ 새로운 객체가 생성될 때 할당된 메모리와 인스턴스 변수들 초기화 ‣ 객체의 변수들 중 첫번째는 클래스 구조에 대한 포인터 - isa 라고 부르를 포인터 - 클래스 자체와 클래스가 상속받은 모든 클래스에 대한 접근이 가능 - isa 포인터는 언어의 일부분이 아니지만, 런타임 시스템에서 동작하기 위해 필요 13년 5월 21일 화
  • 10. Messaging 함수가 동적으로 메소드에 바인딩 되는 과정 메시지가 객체에 전달 isa 포인터를 참조 dispatch table 검색 superclass 포인터를 참조 dispatch table 검색 cache 검색(MRU) 13년 5월 21일 화
  • 11. Using Hidden Arguments ✓ objc_msgSend가 procedure를 찾으면 호출하고, 메시지 내의 모든 인자를 전달 ✓ 두개의 숨은 인자 - receiver - selector ✓ 메소드를 정의한 코드에 선언되어 있지 않기 때문에 “hidden argument” ✓ 코드가 컴파일 될 때 삽입 ✓ 메소드는 수신 객체를 self로, 자신에 대한 selector를 _cmd로 참조 13년 5월 21일 화
  • 13. Getting a Method Address ✓ 동적 바인딩을 회피하는 유일한 방법은 메소드의 주소를 얻어서 마치 함수인 것 처럼 직업 호출하는 방법 - 특정 메소드가 많은 횟수 반복적으로 사용될 때 매번 메시징 하는 오버헤드를 피하고 싶을 때 사용 ✓ NSObject 클래스에 정의된 methodForSelector 사용 - procedure의 포인터 조회 - 포인터를 사용하여 procedure 호출 - 포인터는 알맞은 함수 타입으로 형변환 해야 함! void (*setter)(id, SEL, BOOL); int i; setter = (void (*)(id, SEL, BOOL))[target methodForSelector:@selector(setFilled:)];  for ( i = 0; i < 1000; i++ ) setter(targetList[i], @selector(setFilled:), YES); 13년 5월 21일 화
  • 14. Getting a Method Address @interface MyClass : NSObject { } -(void)doSomething; @end @implementation MyClass  -(void) doSomething { // Do many many work } @end MyClass* myObject = [ [ MyClass alloc ] init ] ; SEL method = @selector(doSomething) ; IMP func = [ myObject methodForSelector:method ] ; func( myObject, method ); 13년 5월 21일 화
  • 15. Dynamic Method Resolution ✓ 동적으로 메소드를 제공해야할 경우가 종종 있다.(?) - @dynamic propertyName; - resolveInstanceMethod: - resolveClassMethod: - 주어진 selector에 대한 구현을 동적으로 제공 ✓ Objective-C 메소드는 최소한 두개의 인자(self, _cmd)를 갖는 C 함수 ✓ class_addMethod 함수를 사용하여 클래스에 함수를 메소드로 추가할 수 있음. ✓ Forwarding 메소드 또는 dynamic method resolution 둘 중 한가지 방법으로 동적 메소드 호출 ✓ Forwarding 메커니즘을 시작하기 전에 dynamic method resolution 을 수행 13년 5월 21일 화
  • 16. Dynamic Method Resolution void dynamicMethodMP(id self, SEL _cmd) { // implementation … } @implementation MyClass + (BOOL)resolveInstanceMethod:(SEL)aSEL { if (aSEL == @selector(resolveThisMethodDynamically)) { class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP,“v@:”); returnYES; } return [super resolveInstanceMethod:aSEL]; } @end 13년 5월 21일 화
  • 17. Dynamic Loading Objective-C 프로그램은 실행 중에 새로운 클래스와 카테고리를 로드하고 링크할 수 있다. 13년 5월 21일 화
  • 18. Message Forwarding ✓ 메시지 처리가 정의되어 있지 않은 객체에 메시지를 보내면 에러 발생 ✓ 에러가 발생하기 전에 런타임 시스템은 메시지를 이해하고 있는 곳으로 메시지를 전달 ==> Message Forwarding ✓ NSInvocation 객체를 단일 인자로 하는 forwardInvocation 메시지 전달 -(void)forwardInvocation:(NSInvocation *) anInvocation ✓ 이 메소드는 NSObject에서 정의되어 있기 때문에 모든 객체에 사용할 수 있음. ✓ NSInvocation객체에는 target, selector, parameter 같이 메세지 송신에 필요한 모든 정보가 들어있음. 13년 5월 21일 화
  • 19. Message Forwarding - negotiate { if ( [someOtherObject respondsTo:@selector(negotiate)] ) return [someOtherObject negotiate]; return self; } 13년 5월 21일 화
  • 20. Message Forwarding - (void)forwardInvocation:(NSInvocation *)anInvocation { if ([someOtherObject respondsToSelector: [anInvocation selector]]) [anInvocation invokeWithTarget:someOtherObject]; else [super forwardInvocation:anInvocation]; } - 동적인 방법으로 메시지 전달 - 메시지 내의 selector와 일치하는 메소드가 없을 때 호출 - 원래 인자들과 함께 전달할 곳으로 보내야 함 - 전달된 메시지의 리턴값은 원래 호출자에게 돌아감 - 알 수 없는 메시지들을 서로 다른 수신자에게 배분하는 역할 (또는 모든 메시지를 같은 목적지로 보내는 역할) - 객체에 전달한 메시지가 존재할 경우 forwardInvocation은 호출되지 않음 13년 5월 21일 화
  • 21. Forwarding and Multiple Inheritance ✓ 포워딩은 다중 상속의 효과를 주는데 사용할 수 있다. (다중 상속에서 원하는 대부분의 기능을 제공) ✓ 메시지를 전달하는 객체는 receiver가 메시지를 처리하는 것 처럼 보이며, 값을 리턴 받는다. 13년 5월 21일 화
  • 22. Surrogate Object ✓ 다른 객체를 대신하고 메시지를 전달해주는 역할 ✓ 크고, 무거운 동작을 수행하는 객체의 앞단에서 동작하는 객체 (경량 객체) ✓ 데이터에 관한 질의와 같은 간단한 처리는 직접 수행하고, 무거운 처리가 필요할 경우 실제 처리 객체에게 메시지 전달 ✓ 커다란 객체로 향하는 모든 메시지는 surrogate를 통하게 되고, 다른 객체들은 두 객체를 동일하게 보게 됨 13년 5월 21일 화
  • 23. Forwarding and Inheritance ✓ 포워딩이 상속과 유사하게 보일지라도, respondsToSelector: , isKindOfClass: 같은 메소드는 forwarding chain을 고려하지 않는다. ✓ 만약 포워딩 객체가 실제 객체의 모든 행위를 상속 받은 것 처럼 사용하고 싶다면, 위 메소드를 오버라이딩 해야 한다. (BOOL)respondsToSelector:(SEL)aSelector { if ( [super respondsToSelector:aSelector] ) returnYES; else { /* 이 부분에 aSelector 메시지가  * * 다른 객체로 전달될 수 있는지 그리고   * * 해당 객체가 메시지에 응답할 수 있는지를 체크하고 * * 그럴수 있다면YES를 되돌리는 코드를 넣는다.   */ } return NO; } 13년 5월 21일 화
  • 24. Forwarding and Inheritance ✓ instancesRespondToSelector: , conformsToProtocol: 메소드 등도 필요에 따라 반영해야 한다. ✓ 객체가 원격지에서 수신한 모든 메시지를 전달한다면, methodSignatureForSelector: 메소드 구현해야 한다. (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { NSMethodSignature* signature = [super methodSignatureForSelector:selector]; if (!signature) { signature = [surrogate methodSignatureForSelector:selector]; } return signature; } 13년 5월 21일 화
  • 25. class object isa Class Object instance variable instance method table metaclass object isa class method table NSObject 13년 5월 21일 화
  • 27. typedef struct objc_class *Class; typedef struct objc_object { Class isa; } *id; struct objc_class { Class isa; Class super_class const char *name long version long info long instance_size struct objc_ivar_list *ivars struct objc_method_list **methodLists struct objc_cache *cache struct objc_protocol_list *protocols } runtime.h typedef struct objc_method *Method; struct objc_method { SEL method_name char *method_types IMP method_imp } objc.h 13년 5월 21일 화