Objective-C Language
클래스와 객체
수색…
통사론
- Cat * cat = [[Cat alloc] init]; // Cat 유형의 cat 객체를 만듭니다.
- Dog * dog = [[Dog alloc] init]; // Dog 유형의 dog 객체를 만듭니다.
- NSObject * someObject = [NSObject alloc]; [someObject init]; // 하지 마라.
- XYZObject * object = [XYZObject new]; // 초기화에 인수가 필요없는 경우 new를 사용하여 객체를 만듭니다.
- NSString * someString = @ "Hello, World!"; // 리터럴 구문을 사용 하여 NSString 만들기
- NSNumber * myFloat = @ 3.14f; // 리터럴 구문을 사용하여 NSNumber를 만드는 또 다른 예
- NSNumber * myInt = @ (84 / 2); // 박스형 표현식을 사용하여 객체 만들기
초기화 값을 사용하여 클래스 만들기
#import <Foundation/Foundation.h>
@interface Car:NSObject {
NSString *CarMotorCode;
NSString *CarChassisCode;
}
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
CarMotorCode = motorCode;
CarChassisCode = chassisCode;
return self;
}
- (void) startCar {...}
- (void) stopCar {...}
@end
메소드 initWithMotorValue: type andChassisValue: type
은 Car 객체를 초기화하는 데 사용됩니다.
싱글 톤 클래스
싱글 톤 클래스 란 무엇입니까?
싱글 톤 클래스는 응용 프로그램이 요청한 횟수와 상관없이 동일한 인스턴스를 반환합니다. 일반 클래스와 달리, 싱글 톤 객체는 해당 클래스의 리소스에 대한 전역 액세스 지점을 제공합니다.
싱글 톤 클래스를 언제 사용합니까?
싱글 톤은 일반적인 서비스 나 리소스를 제공하는 클래스와 같이이 단일 제어 지점이 바람직한 상황에서 사용됩니다.
싱글 톤 클래스 생성 방법
먼저 NSObject
에서 새 파일을 만들고 하위 클래스로 만듭니다. 여기에 CommonClass
를 사용합니다. Xcode는 이제 CommonClass.h 및 CommonClass.m 파일을 생성합니다.
CommonClass.h
파일에서 다음을 CommonClass.h
하십시오.
#import <Foundation/Foundation.h>
@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end
CommonClass.m
파일에서 :
#import "CommonClass.h"
@implementation CommonClass
+ (CommonClass *)sharedObject {
static CommonClass *sharedClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClass = [[self alloc] init];
});
return sharedClass;
}
- (id)init {
if (self = [super init]) {
self.commonString = @"this is string";
}
return self;
}
@end
싱글 톤 클래스 사용 방법
앞에서 작성한 Singleton Class는 관련 모듈에 CommonClass.h
파일을 가져온 한 프로젝트의 어느 곳에서나 액세스 할 수 있습니다. Singleton Class에서 공유 데이터를 수정하고 액세스하려면 다음과 같이 sharedObject
메소드를 사용하여 액세스 할 수있는 해당 클래스의 공유 Object에 액세스해야합니다.
[CommonClass sharedObject]
공유 클래스의 요소를 읽거나 수정하려면 다음을 수행하십시오.
NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class
NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class
"instancetype"반환 형식
Objective-C는`instancetype '이라는 특수한 타입을 지원합니다.이 타입은 메소드에 의해 반환되는 타입으로 만 사용될 수 있습니다. 그것은 수신 객체의 클래스로 평가됩니다.
다음 클래스 계층을 고려하십시오.
@interface Foo : NSObject
- (instancetype)initWithString:(NSString *)string;
@end
@interface Bar : Foo
@end
[[Foo alloc] initWithString:@"abc"]
이 호출되면 컴파일러는 반환 유형이 Foo *
라고 추정 할 수 있습니다. Foo
에서 파생되었지만 이니셜 라이저의 선언을 재정의하지 않은 Bar
클래스입니다. 그러나 instancetype
덕분에 컴파일러는 [[Bar alloc] initWithString:@"xyz"]
Bar *
유형의 값을 반환한다는 것을 유추 할 수 있습니다.
대신 -[Foo initWithString:]
의 반환 유형을 Foo *
간주하십시오. [[Bar alloc] initWithString:]
호출하면 컴파일러는 Bar *
아닌 Foo *
가 반환된다는 것을 컴파일러에서 추론합니다. 개발자. instancetype
이이 문제 instancetype
해결했습니다.
instancetype
이 도입되기 전에 이니셜 라이저, 싱글 톤 접근 자 등의 정적 메서드와 수신 클래스의 인스턴스를 반환하려는 다른 메서드는 id
를 반환해야했습니다. 문제는 id
는 "모든 유형의 객체"를 의미한다는 것입니다. 컴파일러는 따라서 NSString *wrong = [[Foo alloc] initWithString:@"abc"];
잘못된 유형의 변수에 지정 중입니다.
이 문제로 인해 이니셜 라이저는 반환 값 으로 id
대신 instancetype
항상 사용해야 instancetype
.
제네릭 지정
NSArray
또는 NSDictionary
와 마찬가지로 generics를 사용 하여 클래스를 향상시킬 수 있습니다.
@interface MyClass<__covariant T>
@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;
- (void) addObject:(nonnull T)obj;
@end
할당과 초기화의 차이점
대부분의 객체 지향 언어에서 객체에 대한 메모리 할당과 초기화는 원자 적 연산입니다.
// Both allocates memory and calls the constructor
MyClass object = new MyClass();
Objective-C에서 이러한 작업은 별도의 작업입니다. 클래스 메쏘드 인 alloc
(그리고 그의 역사적인 형제 인 allocWithZone:
은 Objective-C 런타임이 필요한 메모리를 예약하고 그것을 지우게한다. 몇 가지 내부 값을 제외하고 모든 특성 및 변수는 0 / NO
/ nil
로 설정됩니다.
객체는 이미 "유효"하지만 객체를 실제로 설정하는 메소드를 호출하기를 원합니다.이 메소드는 초기화 프로그램 이라고 부릅니다. 이들은 다른 언어의 생성자 와 같은 목적을 수행합니다. 규칙에 따라 이러한 메소드는 init
시작 init
. 언어 적 관점에서 볼 때, 그들은 단지 정상적인 방법 일뿐입니다.
// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];
// Shorthand:
object = [[MyClass alloc] init];