목표-C 정적 클래스 수준 변수
각각 고유한 ID를 저장하는 필름 클래스가 있습니다.C#, Java 등에서 정적 전류를 정의할 수 있습니다.ID와 ID를 설정할 때마다 전류를 증가시킬 수 있습니다.ID 및 변경 사항은 개체 수준이 아닌 클래스 수준에서 발생합니다.목표 C에서 이 작업을 수행할 수 있습니까?저는 이것에 대한 답을 찾는 것이 매우 어렵다는 것을 알았습니다.
문제 설명:
- 클래스 A에 클래스 B 변수를 사용하려고 합니다.
- 프로그래밍 언어로 목표-C를 사용하고 있습니다.
- Objective-C는 C++처럼 클래스 변수를 지원하지 않습니다.
한 가지 대안:
Objective-C 기능을 사용하여 클래스 변수 동작 시뮬레이션
클래스 A 메서드(및 클래스 A 내에 배치한 모든 항목)에만 액세스할 수 있도록 클래스 A 내에 정적 변수를 선언/정의합니다.
NSObject Initialize 클래스 메서드를 덮어쓰면 ClassB 인스턴스가 있는 정적 변수가 한 번만 초기화됩니다.
NSObject Initialize 메서드를 덮어쓰는 이유는 무엇인지 궁금하실 것입니다.이 메서드에 대한 Apple 문서에는 다음과 같은 대답이 있습니다. "런타임은 클래스 또는 클래스에서 상속되는 클래스가 프로그램 내에서 첫 번째 메시지를 보내기 직전에 프로그램의 각 클래스에 정확히 한 번씩 초기화를 보냅니다.(따라서 클래스를 사용하지 않을 경우 메서드를 절대로 호출할 수 없습니다.)
클래스 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
참조:
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
'sourcecode' 카테고리의 다른 글
Bash의 경로 문자열에서 파일 접미사와 경로 부분을 제거하려면 어떻게 해야 합니까? (0) | 2023.04.28 |
---|---|
문서에 대해 검색된 문법 제약 조건(DTD 또는 XML 스키마)이 없습니다. (0) | 2023.04.28 |
VBA에 3개의 연산자가 있습니까? (0) | 2023.04.28 |
다른 클래스에서 실행 중인 다른 스레드에서 UI를 업데이트하는 방법 (0) | 2023.04.28 |
이클립스와 같은 Android Studio 바로 가기 (0) | 2023.04.28 |