수색…


통사론

  • 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];


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow