카테고리 | 게시글 작성 날짜 | 게시글 최근 수정 날짜 | 작성자 |
C/C++ | 2022.03.31. 22:24 | 2023.08.09. 22:09 | Dev.Yang |
🛠 메서드 (Method)
🛠 Objective-C 동작 방식
Objective-C 언어는 C언어를 근간으로 동작하고 있으며 추가적으로 아래의 4가지 조건을 통하여 작동하고 있습니다.
- 첫번째는 인스턴스 변수 (Instance Variable)는 구조체 (Struct)에 저장됩니다.
- 새 클래스와 그에 속한 인스턴스 변수를 정의하면, 이 인스턴스 변수들은 사실 구조체 안에 저장이 됩니다. 실제로는 객체는 인스턴스 변수로 멤버들이 구성 된 구조체로 볼 수 있습니다.
- 구조체의 상속받은 멤버 중에 보호 멤버 isa (루트 객체에게서 상속 받은 정보)가 있는데, 이것이 객체가 속한 클래스를 식별하며 이 멤버가 구조체의 일부이므로 계속 객체에 저장되어 있습니다.
- 두번째는 객체 변수 (Object Variable)는 사실 포인터 (Pointer)입니다.
- 세번째는 메서드 (Method)는 함수이고, 메시지 표현식은 함수 호출입니다.
- 메서드는 사실상 함수이고, 메서드를 호출하면 수신자의 클래스에 연결 된 함수를 호출합니다.
- 네번째는 id형은 일반 포인터 형입니다.
- 객체는 메모리 주소인 포인터로 참조되기 때문에 id 변수에 자유롭게할당할 수 있으며, id를 반환하는 메서드는 결과적으로 메모리의 어느 객체를 가리키는 포인터를 반환합니다.
🛠 카테고리 (Category)
카테고리 (Category)는 클래스 정의를 그룹짓거나, 연관된 메서드를 카레고리로 쉽게 모듈러화 작업을 할 수 있게하는 기능입니다. 또한, 원본 소스 코드에 접근하거나 서브클래스를 생성하지 않고도 기존의 클래스의 정의를 쉽게 확장하는 방법도 제공합니다.
추가적으로 카테고리 (Category)는 클래스에 인스턴스 변수를 추가할 수 없으며 메소드만 추가할 수 있습니다. 대신 클래스 메소드와 인스턴스 메소드를 모두 선언할 수 있습니다.
카테고리 (Category)에 대한 예제 소스코드는 아래와 같습니다.
@interface Fraction : NSObject
@property int numerator, denominator;
- (double) convertToNum;
- (void) print;
@end
@interface Fraction (MathOps)
- (Fraction *) add: (Fraction *) f;
- (Fraction *) minus: (Fraction *) f;
- (Fraction *) sub: (Fraction *) f;
- (Fraction *) div: (Fraction *) f;
@end
🛠 id Type
id 데이터 형은 어떠한 형태의 객체든지 저장할 수 있는 일반 객체형 타입입니다.
🛠 클래스 메서드 (Class Method)
+ (int) print;
함수 반환형의 맨 앞에 "+" 부호를 가진 메서드를 의미합니다.
🛠 인스턴스 메서드 (Instance Method)
- (int) print;
함수 반환형의 맨 앞에 "-" 부호를 가진 메서드를 의미합니다.
🛠 블럭 (Block)
Objective-C에서의 블럭 (Block) 구문은 일종의 코드 묶음을 나타내며 Swift에서의 클로저 (Closure)와 유사합니다.
Objective-C에서의 Block 특징은 아래와 같습니다.
- 변수나 데이터 구조에 포함 시킬 수 있습니다.
- 함수의 파라미터로 전달 할 수 있습니다.
- 반환 값 (Return Value)으로 사용할 수 있습니다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능합니다.
🗂 Basic Block Source Code
아래의 예제 소스코드와 같이 symbol (^) 기호를 사용하여 Block 정의를 시작합니다.
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};
simpleBlock();
🗂 Blocks Take Arguments and Return Values Source Code
매개변수와 반환 값을 가지는 Block에 대한 예제 소스코드는 아래와 같습니다.
double (^multiplyTwoValues)(double, double) = ^(double firstValue, double secondValue) {
return firstValue * secondValue;
};
double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f", result);
int (^addNumbers)(int, int) = ^(int num1, int num2) {
return num1 + num2;
};
int sumResult = addNumbers(5, 7); // result는 12가 됩니다.
NSLog(@"The result is %d", sumResult);
🗂 Use Type Definitions to Simplify Block Source Code
일반적으로 타입 정의를 통하여 자주 사용되는 Block 소스코드 예제입니다.
typedef void (^ResponseBlock)(NSData *data, NSError *error);
@property (nonatomic, strong) ResponseBlock responseBlock;
- (void)startRequestWithCompletion:(ResponseBlock)responseBlock;
순환 참조 방지하기 (Avoid Strong Reference Cycles when Capturing self)
Objective-C에서의 Block 구문은 객체를 강함 참조 (Strong Reference)로 객체를 소유하고 있기 때문에 순환 참조가 발생하여 메모리 누수 (Memory Leak)가 발생할 수 있습니다. 그렇기에 아래와 같이 강함 참조를 약한 참조를 가지는 객체를 생성하여 전달 해주면 순환 참조를 방지할 수 있습니다.
순환 참조 방지를 위한 예제 소스코드는 아래와 같습니다.
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // capture the weak reference
// to avoid the reference cycle
}
}
🚀 REFERENCE
Learn Objective-C: Methods (in Detail)
The majority of the following text is derived from Apple’s authoritative guide on the Objective-C language—The Objective-C Programming Language*: Chapter 1: Objects, Classes, and Messaging.* Message Syntax You send a message to an object to have it do
www.binpress.com
프로그래밍 오브젝티브 C 2.0
오브젝티브-C의 안내서!스티븐 코찬의 『프로그래밍 오브젝티브-C 2.0』. 맥 OS X뿐 아니라, 아이폰 응용 프로그램을 개발할 때 사용하는 표준 프로그래밍 언어면서, 강력하고 단순한 객체 지향 프
book.naver.com
[Objective-C]클래스 확장 - Category, Extension
카테고리 카테고리는 클래스 선언 부분 중 특정 부분에 따로 이름을 붙이는 방법입니다. 자바에서 클래스를 하나의 묶음으로 선언해야 사용할 수 있지만 오브젝티브C에서는 클래스를 여러 개의
minsone.github.io
[Objective-C]Block 객체 사용하기
블록 객체는 C언어의 확장이며 비표준입니다.(wikipedia 참조) 다른 언어에서 클로저(closure) 또는 익명함수, 람다함수, 일급 객체(first-class object)라고 합니다. 우선 Objective-C에서 다루므로 블록 객체
minsone.github.io
Working with Blocks
Working with Blocks An Objective-C class defines an object that combines data with related behavior. Sometimes, it makes sense just to represent a single task or unit of behavior, rather than a collection of methods. Blocks are a language-level feature add
developer.apple.com
'#컴퓨터 과학 [Computer Science] > C/C++' 카테고리의 다른 글
[C/C++] C++ 백터와 배열의 차이점 (C++ Vector and Array Difference) (0) | 2020.02.23 |
---|---|
[C/C++] 시리얼 통신 (Serial Communication) (0) | 2019.09.04 |
[C/C++] INI (Initialization) 파일 (0) | 2019.08.22 |
[C/C++] 전송 제어 프로토콜 (TCP, Transmission Control Protocol) (0) | 2019.06.19 |
C/C++ Computer Language (0) | 2019.05.06 |
댓글