Objective-C Language
기본 데이터 유형
수색…
통사론
- BOOL havePlutonium = YES; // 직접 할당
- BOOL fastEnough = (자동차 속도 입력> 88); // 비교 식
- BOOL 플럭스 커패시터 활성 (= 플러스 & 플러스); // 부울 표현식
- id somethingWicked = [witchesCupboard lastObject]; // 형식화되지 않은 객체 검색
- 이드 분말 = prepareWickedIngredient (somethingWicked); // 전달 및 반환
- if ([ingredients isKindOfClass : [Toad class]]) {// 테스트 런타임 유형
BOOL
BOOL
유형은 Objective-C의 부울 값에 사용됩니다. 보다 일반적인 "true"및 "false"와는 달리 두 개의 값인 YES
와 NO
있습니다.
그것의 행동은 C 언어의 것과 똑같고 똑같습니다.
BOOL areEqual = (1 == 1); // areEqual is YES
BOOL areNotEqual = !areEqual // areNotEqual is NO
NSCAssert(areEqual, "Mathematics is a lie"); // Assertion passes
BOOL shouldFlatterReader = YES;
if (shouldFlatterReader) {
NSLog(@"Only the very smartest programmers read this kind of material.");
}
BOOL
은 기본 요소이므로 Foundation 컬렉션에 직접 저장할 수 없습니다. NSNumber
랩핑되어야합니다. Clang은 이에 대한 특별한 구문을 제공합니다.
NSNumber * yes = @YES; // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO; // Equivalent to [NSNumber numberWithBool:NO]
BOOL
구현은 C99 표준 유형 bool
의 typedef라는 점에서 C에 직접 기반합니다. YES
및 NO
값은 각각 __objc_yes
및 __objc_no
에 각각 정의됩니다. 이러한 특수 값은 (BOOL)1
및 (BOOL)0
으로 변환되는 Clang에 의해 도입 된 컴파일러 내장 함수입니다. 사용할 수없는 경우 YES
및 NO
가 직접 캐스트 형 형식으로 정의됩니다. 정의는 Objective-C 런타임 헤더 objc.h에 있습니다.
신분증
id
는 "모든 객체"를 나타내는 Objective-C 유형의 일반 객체 포인터입니다. Objective-C 클래스의 인스턴스는 id
변수에 저장 될 수 있습니다. id
및 다른 클래스 유형은 형 변환없이 앞뒤로 할당 할 수 있습니다.
id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];
이것은 콜렉션에서 오브젝트를 검색 할 때 적합합니다. objectAtIndex:
같은 메소드의 반환 유형은 정확히 이런 이유로 id
입니다.
DataRecord * record = [records objectAtIndex:anIndex];
또한 id
유형화 된 메소드 또는 함수 매개 변수가 모든 객체를 허용 할 수 있음을 의미합니다.
객체를 id
로 입력하면 알려진 모든 메시지를 전달할 수 있습니다. 메소드 디스패치는 컴파일 타임 유형에 의존하지 않습니다.
NSString * extinctBirdMaybe =
[anonymousSurname stringByAppendingString:anonymousSurname];
객체가 실제로 응답하지 않는다는 메시지는 물론 런타임에 예외를 발생시킵니다.
NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception
예외에 대비하기.
NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
nope = [anonymousSurname addTimeInterval:10];
}
id
유형은 objc.h에 정의되어 있습니다.
typedef struct objc_object {
Class isa;
} *id;
SEL
선택자는 Objective-C의 메소드 식별자로 사용됩니다.
아래 예제에는 두 개의 선택기가 있습니다. new
및 setName:
Person* customer = [Person new];
[customer setName:@"John Doe"];
대괄호의 각 쌍은 메시지 전송에 해당합니다. 첫 번째 줄에서는 new
선택자를 포함하는 메시지를 Person
클래스에 보내고 두 번째 줄에는 setName:
selector와 문자열이 포함 된 메시지를 보냅니다. 이 메시지의 수신자는 선택자를 사용하여 수행 할 올바른 조치를 찾으십시오.
대부분의 경우 브래킷 구문을 사용하여 메시지를 전달하는 것으로 충분하지만 간혹 선택기 자체를 사용해야합니다. 이러한 경우 SEL
유형을 사용하여 선택기에 대한 참조를 보유 할 수 있습니다.
선택기를 컴파일 할 때 사용할 수있는 경우 @selector()
를 사용하여 선택기를 참조 할 수 있습니다.
SEL s = @selector(setName:);
그리고 런타임에 selector를 찾으려면 NSSelectorFromString을 사용하십시오.
SEL s NSSelectorFromString(@"setName:");
NSSelectorFromString을 사용할 때는 NSString에 선택기 이름을 래핑해야합니다.
이것은 대개 대리인이 선택적 메서드를 구현하는지 확인하는 데 일반적으로 사용됩니다.
if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
[self.myDelegate doSomething];
}
IMP (구현 포인터)
IMP는 구현 포인터라고도하는 메소드 구현을 나타내는 C 유형입니다. 메소드 구현의 시작에 대한 포인터입니다.
통사론:
id (*IMP)(id, SEL, …)
IMP는 다음과 같이 정의됩니다.
typedef id (*IMP)(id self,SEL _cmd,…);
이 IMP에 액세스하려면 "methodForSelector" 메시지를 사용할 수 있습니다.
예제 1 :
IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];
IMP에 의해 강조된 메소드는 IMP를 참조 해제함으로써 호출 될 수 있습니다.
ImpDoSomething(myObject, @selector(doSomething));
따라서 이러한 호출은 동일합니다.
myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];
예 : 2 :
SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");
IMP methodImplementation = [self methodForSelector:otherWaySelector];
result = methodImplementation( self,
betterWaySelector,
first,
second,
third );
NSLog(@"methodForSelector : %@", result);
여기서 우리는 [NSObject methodForSelector]를 호출하여 메소드를 실제로 구현하는 C 함수에 대한 포인터를 반환합니다.이 함수는 이후에 직접 호출 할 수 있습니다.
NSInteger 및 NSUInteger
NSInteger는 아키텍처에 따라 int 또는 long 형식의 typedef입니다. unsigned 변수의 typedef 인 NSUInteger에서도 마찬가지입니다. NSInteger를 확인하면 다음과 같이 표시됩니다.
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
signed 및 unsigned int 또는 long의 차이점은 부호가있는 int 또는 long에 음수 값이 포함될 수 있다는 것입니다. int의 범위는 -2 147 483 648 ~ 2 147 483 647이며 부호없는 int의 범위는 0 ~ 4 294 967 295입니다. 첫 번째 비트가 더 이상 사용되지 않아 값이 음수이므로 값이 두 배가됩니다 아닙니다. 64 비트 아키텍처에서 NSInteger가 길면 범위가 훨씬 넓어집니다.
Apple이 제공하는 대부분의 메소드는 일반 int보다 NS (U) Integer를 반환합니다. 64 비트 아키텍처에서 실행 중일 때 정밀도를 잃어 버리므로 일반 int로 캐스팅하려고하면 경고 메시지가 표시됩니다. 대부분의 경우 중요하지 않지만 NS (U) Integer를 사용하는 것이 더 쉽습니다. 예를 들어 배열의 count 메서드는 NSUInteger를 반환합니다.
NSNumber *iAmNumber = @0;
NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];
NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.
BOOL과 마찬가지로 NS (U) Integer는 기본 데이터 유형이므로 NSNumber에 포장해야 할 수도 있습니다. 정수 앞에 @를 사용하면 위에서와 같이 캐스팅하고 아래 메소드를 사용하여 검색 할 수 있습니다. 그러나 NSNumber로 변환하려면 다음 방법을 사용할 수도 있습니다.
[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];