objective-c
스몰톡 언어의 객체지향적인 부분 + C언어
월등한 유연성
클래스 객체, 인스턴스 객체 (스몰톡에서는 클래스도 객체이기 때문에 클래스도 객체로 볼수 있음)
@마크를 붙인 예약어를 사용하여 언어를 확장시킴
C++과는 다르게 단일 상속만 허용함, 클래스 이름은 유일해야하며, 내포클래스를 만들 수 없음
@interface : 클래스를 선언한 부분
@implementation : 미리 선언된 클래스를 정의한 부분
@end : 선언과 정의가 끝났음을 의미
@interface Sample : Object
@interface 바로 뒤에는 선언할 클래스의 이름이 오게 되고 ":" 다음에 수퍼클래스가 명시됨
{ ... } 사이에 있는 변수들이 인스턴스 변수가 됨 (C++의 멤버변수와 같음)
멤버변수들을 선언하고 그 아래에 메소드들을 정의함
메소드 정의에, +, - 기호는 클래스 메소드(+)인지 인스턴스 메소드(-)인지를 명시하는 부분
클래스와 인스턴스를 엄격하게 구분해야함!
클래스 메소드는 클래스에서만 호출이 가능, 인스턴스 메소드는 인스턴스에서만 호출 가능
인스턴스를 얻어내려면
id obj = [Sample alloc];
이런 식으로 사용
클래스 메소드 alloc을 호출하고 돌려주는 값이 obj가 됨
여기서 obj가 클래스의 인스턴스가 됨
인스턴스가 클래스 정의에서 명시한 데이터에 해당하는 부분을 가지게 되고, 인스턴스 메소드를 이용하여 이것들을 다루게 됨
obj의 데이터 타입인 id는 인스턴스를 의미하는 데이터 타입, 클래스에 대한 포인터 값을 가진다
[, ] 는 클래스와 인스턴스의 메소드를 호출할 때 사용됨
[obj method: arg1 : arg2] 와 같이 : 를 구분자로 사용
super는 자신의 수퍼클래스를 의미, self는 자기 자신을 의미
즉, 메소드 호출 시 [self init]; 이런식으로 쓰면 되고, 수퍼 클래스의 경우 [super init]; 라고 사용
단순한 추상 클래스를 사용할 땐, 메소드 정의에 단순히 { return; } 라고 사용하면 됨
클래스 선언 시 인스턴스 변수가 반드시 있을 필요 없음, 단순히 메소드 선언만 있어도 됨
Dynamic binding
객체의 메소드를 호출할 때, 그 메소드가 뭔지 정적으로 컴파일 시에 결정할 수 없음을 의미함
성능 < 유연성이 커짐
Dynamic typing
데이터 타입이 어떤 클래스인지 컴파일 시에 알 수 없음
인스턴스가 어떤 클래스의 인스턴스인지 실행하고 확인하기 전에는 알 수 없음
Dynamic loading
클래스를 실행시간 중에 새로 넣을 수 있음 (일종의 플러그인)
objective-c에서는 아예 메소드 콜이 동적으로 이루어짐
실행시간 중에 호출할 함수의 주소가 결정되는 것에다가
함수 이름 자체를 실행시간 중에 결정할 수 있음
셀렉터를 이용한 기술임
구조 자체가 메소드를 동적으로 할당하는 구조이므로 더 강력한 기능을 가질 수 있는데, 이것이 category라는 기능
'보안 및 개발 > MOBILE' 카테고리의 다른 글
[iOS] 파일시스템 구조 (0) | 2019.10.07 |
---|---|
[iOS] Frida 사용자함수 hooking (0) | 2019.10.07 |
[iOS] Frida server 설치 에러 (0) | 2019.10.07 |
[iOS] frida hooking (0) | 2019.10.07 |
[iOS] frida 환경 구성 (0) | 2019.10.07 |