수색…


통사론

  • BOOL havePlutonium = YES; // 직접 할당
  • BOOL fastEnough = (자동차 속도 입력> 88); // 비교 식
  • BOOL 플럭스 커패시터 활성 (= 플러스 & 플러스); // 부울 표현식
  • id somethingWicked = [witchesCupboard lastObject]; // 형식화되지 않은 객체 검색
  • 이드 분말 = prepareWickedIngredient (somethingWicked); // 전달 및 반환
  • if ([ingredients isKindOfClass : [Toad class]]) {// 테스트 런타임 유형

BOOL

BOOL 유형은 Objective-C의 부울 값에 사용됩니다. 보다 일반적인 "true"및 "false"와는 달리 두 개의 값인 YESNO 있습니다.

그것의 행동은 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에 직접 기반합니다. YESNO 값은 각각 __objc_yes__objc_no 에 각각 정의됩니다. 이러한 특수 값은 (BOOL)1(BOOL)0 으로 변환되는 Clang에 의해 도입 된 컴파일러 내장 함수입니다. 사용할 수없는 경우 YESNO 가 직접 캐스트 형 형식으로 정의됩니다. 정의는 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의 메소드 식별자로 사용됩니다.

아래 예제에는 두 개의 선택기가 있습니다. newsetName:

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


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