sourcecode

목표-C 정적 클래스 수준 변수

codebag 2023. 4. 28. 20:32
반응형

목표-C 정적 클래스 수준 변수

각각 고유한 ID를 저장하는 필름 클래스가 있습니다.C#, Java 등에서 정적 전류를 정의할 수 있습니다.ID와 ID를 설정할 때마다 전류를 증가시킬 수 있습니다.ID 및 변경 사항은 개체 수준이 아닌 클래스 수준에서 발생합니다.목표 C에서 이 작업을 수행할 수 있습니까?저는 이것에 대한 답을 찾는 것이 매우 어렵다는 것을 알았습니다.

문제 설명:

  1. 클래스 A에 클래스 B 변수를 사용하려고 합니다.
  2. 프로그래밍 언어로 목표-C를 사용하고 있습니다.
  3. Objective-C는 C++처럼 클래스 변수를 지원하지 않습니다.

가지 대안:

Objective-C 기능을 사용하여 클래스 변수 동작 시뮬레이션

  1. 클래스 A 메서드(및 클래스 A 내에 배치한 모든 항목)에만 액세스할 수 있도록 클래스 A 내에 정적 변수를 선언/정의합니다.

  2. NSObject Initialize 클래스 메서드를 덮어쓰면 ClassB 인스턴스가 있는 정적 변수가 한 번만 초기화됩니다.

  3. NSObject Initialize 메서드를 덮어쓰는 이유는 무엇인지 궁금하실 것입니다.이 메서드에 대한 Apple 문서에는 다음과 같은 대답이 있습니다. "런타임은 클래스 또는 클래스에서 상속되는 클래스가 프로그램 내에서 첫 번째 메시지를 보내기 직전에 프로그램의 각 클래스에 정확히 한 번씩 초기화를 보냅니다.(따라서 클래스를 사용하지 않을 경우 메서드를 절대로 호출할 수 없습니다.)

  4. 클래스 A 클래스/인스턴스 메서드 내에서 정적 변수를 자유롭게 사용할 수 있습니다.

코드 샘플:

파일: 클래스 A.m.

static ClassB *classVariableName = nil;

@implementation ClassA

...
 
+(void) initialize
{
    if (! classVariableName)
        classVariableName = [[ClassB alloc] init];
}

+(void) classMethodName
{
    [classVariableName doSomething]; 
}

-(void) instanceMethodName
{
    [classVariableName doSomething]; 
}

...

@end

참조:

  1. 목표-C 및 C++ 접근 방식을 비교하는 클래스 변수 설명

Xcode 8부터는 Obj-C에서 클래스 속성을 정의할 수 있습니다.이것은 Swift의 정적 속성과 상호 운용하기 위해 추가되었습니다.

Objective-C는 이제 Swift 유형 속성과 상호 운용되는 클래스 속성을 지원합니다.@property(class) NSString *someStringProperty;로 선언됩니다.그들은 결코 합성되지 않습니다. (23891898)

여기 예가 있습니다.

@interface YourClass : NSObject

@property (class, nonatomic, assign) NSInteger currentId;

@end

@implementation YourClass

static NSInteger _currentId = 0;

+ (NSInteger)currentId {
    return _currentId;
}

+ (void)setCurrentId:(NSInteger)newValue {
    _currentId = newValue;
}

@end

그러면 다음과 같이 액세스할 수 있습니다.

YourClass.currentId = 1;
val = YourClass.currentId;

여기 제가 이 오래된 답변을 편집하기 위해 참고로 사용한 매우 흥미로운 설명 게시물이 있습니다.


2011년 답변: (이것을 사용하지 마세요, 끔찍합니다)

만약 당신이 정말로 글로벌 변수를 선언하고 싶지 않다면, 다른 선택지가 있을 수 있습니다, 아마도 매우 정통적이지는 않을 것입니다 :-), 하지만 효과가 있습니다...다음과 같은 "get&set" 메서드를 선언하고 내부에 정적 변수를 지정할 수 있습니다.

+ (NSString*)testHolder:(NSString*)_test {
    static NSString *test;

    if(_test != nil) {
        if(test != nil)
            [test release];
        test = [_test retain];
    }

    // if(test == nil)
    //     test = @"Initialize the var here if you need to";

    return test;
}

따라서 가치를 확인하려면 다음과 같이 전화하십시오.

NSString *testVal = [MyClass testHolder:nil]

그런 다음 설정할 때 다음을(를)

[MyClass testHolder:testVal]

수에는 "var" 0을 "var"로 할 수 .testHolder이와 같이:

+ (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test {
    static NSString *test;

    if(shouldSet) {
        if(test != nil)
            [test release];
        test = [_test retain];
    }

    return test;
}

그리고 두 가지 편리한 방법:

+ (NSString*)test {
    return [MyClass testHolderSet:NO newValue:nil];
}

+ (void)setTest:(NSString*)_test {
    [MyClass testHolderSet:YES newValue:_test];
}

도움이 되길 바랍니다!행운을 빌어요.

.m 파일에서 변수를 정적으로 선언할 수 있습니다.

static ClassName *variableName = nil;

그러면 당신은 그것을 초기화할 수 있습니다.+(void)initialize방법.

이것은 일반적인 C 정적 변수이며 Java 또는 C#이 고려하는 의미에서 정적이지 않지만 유사한 결과를 얻을 수 있습니다.

.m 파일에서 파일 글로벌 변수를 선언합니다.

static int currentID = 1;

그런 다음 init 루틴에서 다음을 참조하십시오.

- (id) init
{
    self = [super init];
    if (self != nil) {
        _myID = currentID++; // not thread safe
    }
    return self;
}

또는 다른 시간에 변경해야 하는 경우(예: openConnection 방법), 해당 시간에 추가합니다.스레드에 문제가 있을 수 있는 경우에는 동기화(또는 원자력 추가 사용)를 수행해야 합니다.

pgb가 말했듯이, "클래스 변수"는 없고 "인스턴스 변수"만 있습니다.클래스 변수를 수행하는 objective-c 방법은 클래스의 .m 파일 내부에 있는 정적 전역 변수입니다.정적은 변수를 해당 파일 외부에서 사용할 수 없도록 합니다(즉, 외부 변수일 수 없음).

다음과 같은 옵션이 있습니다.

+(int)getId{
    static int id;
    //Do anything you need to update the ID here
    return id;
}

이 방법이 id에 액세스하는 유일한 방법이 되므로 이 코드에서 어떻게든 업데이트해야 합니다.

(엄밀히 말하자면 질문에 대한 답은 아니지만, 제 경험상 수업 변수를 찾을 때 유용할 것 같습니다.)

클래스 메소드는 종종 클래스 변수가 다른 언어에서 수행하는 많은 역할(예: 테스트 중에 변경된 구성)을 수행할 수 있습니다.

@interface MyCls: NSObject
+ (NSString*)theNameThing;
- (void)doTheThing;
@end
@implementation
+ (NSString*)theNameThing { return @"Something general"; }
- (void)doTheThing {
  [SomeResource changeSomething:[self.class theNameThing]];
}
@end

@interface MySpecialCase: MyCls
@end
@implementation
+ (NSString*)theNameThing { return @"Something specific"; }
@end

자의 , 수의대상입니다.MyCls 출들Resource:changeSomething: 악기로로@"Something general"에의요따라에에 전화가 때doTheThing: 하만에파물체된에서 .MySpecialCase 악기로로@"Something specific".

클래스 이름을 classA.mm 으로 변경하고 클래스에 C++ 기능을 추가할 수 있습니다.

또 다른 가능성은 약간의 것입니다.NSNumber서브클래스 싱글톤

언급URL : https://stackoverflow.com/questions/1063229/objective-c-static-class-level-variables

반응형