iOS:Objective-C 키워드 1

-- self、super、instancetype、id、nsnil、nsnull、static;
========================self、super========================
--참고:http://www.cocoachina.com/macdev/objc/2011/0124/2602.html
@interface Person:NSObject {  
}
- (void) setName:(NSString*) yourName;
@end
@interface PersonMe:Person {  
}
- (void) setAge:(NSUInteger) age;
- (void) setName:(NSString*) yourName andAge:(NSUInteger) age;
@end
@implementation PersonMe
- (void) setName:(NSString*) yourName andAge:(NSUInteger) age {
    [self setAge:age];
    [super setName:yourName];
   NSLog(@"self ' class is %@", [self class]);
   NSLog(@"super' class is %@", [super class]);
}
@end
//   
 PersonMe* me = [[PersonMe alloc] init];
 [me setName:@"asdf" andAge:18];
//    self 's class is PersonMe     super ' s class is PersonMe 
  2:self          viewcontroller  ,        UIButton   ,       button  。self         
[button addTarget:self action:@selector(clicked/clicked:/clicked:event:) forControlEvents:UIControlEventTouchUpInside];
 
 
//  3 :self          
+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}
       
설명:self 클래스
숨겨 진 인자,지향
현재 호출 방법의 클래스,다른 숨겨 진 매개 변 수 는?
_대표
현재 클래스 방법의 selector.여 기 는 이 self 에 만 관심 이 있 습 니 다.슈퍼 가 뭐야?슈퍼 는 숨겨 진 인자 가 아니 라 하나의 인자 일 뿐 입 니 다.
"컴 파 일 러 인디케이터"는 self 가 가리 키 는 것 과 같은 메시지 수신 자 입 니 다.위의 코드 를 예 로 들 면[self set Name]이 든[슈퍼 set Name]이 든'setName'이 든 이 메 시 지 를 받 는 것 입 니 다.
수신 자 는 모두 PersonMe*me 라 는 대상 입 니 다.다른 것 은,
self 호출 방법 을 사용 할 때 현재 클래스 의 방법 목록 에서 찾 습 니 다.없 으 면 부모 클래스 에서 찾 습 니 다.슈퍼 를 사용 할 때 슈퍼 는 컴 파 일 러 에 게 부모 클래스 의 방법 목록 에서 부터 찾 으 라 고 알려 줍 니 다.그리고 부 류 를 호출 하 는 방법 은
       깊이 분석:
        이런 메커니즘 은 도대체 밑바닥 이 어떻게 실현 되 었 습 니까?사실 클래스 방법 을 호출 할 때 컴 파일 러 는 방법 을 C 함수 방법 으로 호출 합 니 다.Apple 의 objcRuntimeRef 상기:       Sending Messages        When it encounters a method invocation, the compiler might generate a call to any of several functions to perform the actual message dispatch, depending on the receiver, the return value, and the arguments. You can use these functions to dynamically invoke methods from your own plain C code, or to use argument forms not permitted by NSObject’s perform… methods. These functions are declared in /usr/include/objc/objc-runtime.h. ■ objc_msgSend sends a message with a simple return value to an instance of a class. ■ objc_msgSend_stret sends a message with a data-structure return value to an instance of  a class. ■ objc_msgSendSuper sends a message with a simple return value to the superclass of an instance of a class. ■ objc_msgSendSuper_stret sends a message with a data-structure return value to the superclass of an instance of a class.        위의 네 가지 방법 중 하나 로 바 뀌 는 것 을 볼 수 있 습 니 다.왜냐하면stret 시리즈 와 없 음stret 의 그 두 가지 유사 성,우선 obbc 에 만 관심 을 가 집 니 다.msgSend 와 obbcmsgSend Super 두 가지 방법.[self setName]호출 을 사용 할 때 obbc 를 사용 합 니 다.msgSend 의 함수,먼저 obj cmsgSend 함수 정의:       id objc_msgSend(id theReceiver, SEL theSelector, ...)        첫 번 째 매개 변 수 는 메시지 수신 자 이 고 두 번 째 매개 변 수 는 호출 된 구체 적 인 방법 인 selector 이 며 그 다음은 selector 방법의 가 변 매개 변수 입 니 다.우 리 는 먼저 이 가 변 적 인 파 라 메 터 를 상관 하지 않 습 니 다.[self set Name:]을 예 로 들 면 컴 파일 러 는 obsc 로 대 체 됩 니 다.msgSend 의 함수 호출,그 중에서 theReceiver 는 self,theSelector 는@selector(setName:)입 니 다.이 selector 는 현재 self 의 class 방법 목록 에서 찾 은 setName 입 니 다.찾 으 면 해당 하 는 selector 를 전달 합 니 다.       [슈퍼 setName]호출 을 사용 할 때,obbc 를 사용 합 니 다.msgSendSuper 함수,obj cmsgSendSuper 의 함수 정의:       id objc_msgSendSuper(struct objc_super *super, SEL op, ...)       첫 번 째 매개 변 수 는 obbc 입 니 다.슈퍼 의 구조 체,두 번 째 매개 변 수 는 위의 방법 과 유사 한 selector 입 니 다.먼저 obsc 를 보 세 요.슈퍼 이 구조 체 는 무엇 입 니까:struct obbcsuper { id receiver; Class superClass; };        이 구조 체 는 두 명의 구성원 을 포함 하고 있 으 며,하 나 는 receiver 입 니 다.이것 은 위의 Obbc 와 유사 합 니 다.msgSend 의 첫 번 째 매개 변수 receiver,두 번 째 구성원 은 슈퍼 라 는 부류 의 부모 클래스 가 무엇 인지 기록 하 는 것 입 니 다.위의 코드 를 예 로 들 면 컴 파일 러 가 PersonMe 에서 set Name:andAge 방법 중의[super set Name:]을 만 났 을 때 이 몇 가지 일 을 시작 합 니 다.obbc 구축슈퍼 의 구조 체,이때 이 구조 체 의 첫 번 째 구성원 변 수 는 receiver 가 PersonMe*me 로 self 와 같 습 니 다.두 번 째 멤버 변수 인 슈퍼 클래스 는 클래스 Person 을 가리 키 는데 PersonMe 의 클래스 가 바로 이 Person 이기 때문이다.        호출 obbcmsgSendSuper 의 방법 은 이 구조 체 와 setName 의 sel 을 전달 합 니 다.함수 에서 하 는 일 은 다음 과 같 습 니 다:obbc슈퍼 구조 체 가 가리 키 는 슈퍼 클 라 스 의 방법 목록 에서 setName 의 selector 를 찾기 시작 하고,찾 은 다음 obbc 로슈퍼->receiver 에서 이 selector 를 호출 하면 obbc 를 사용 할 수도 있 습 니 다.msgSend 이 함수 입 니 다.그러나 이때 의 첫 번 째 매개 변 수 는 theReceiver 가 obbc 입 니 다.슈퍼->receiver,두 번 째 매개 변 수 는 obbc슈퍼->슈퍼 클래스 에서 찾 은 selector.안의 호출 메커니즘 은 대체로 이렇다.
========================instancetype、id========================
--참고:http://blog.csdn.net/wzzvictory/article/details/16994913
개념:instancetype 은 clang 3.5 에서 시작 합 니 다.clang 이 제공 하 는 키 워드 는 특정한 방법 으로 되 돌아 오 는 알 수 없 는 유형의 Objective-C 대상 을 표시 합 니 다.알 수 없 는 유형의 대상 은 id 키워드 로 표시 할 수 있다 는 것 을 잘 알 고 있 습 니 다.그런데 왜 인 스 턴 스 type 이 하나 더 있 습 니까?
-관련 반환 형식(related result types):
코코아 의 명명 규칙 에 따라 다음 규칙 을 만족 시 키 는 방법:
1.클래스 방법 중 alloc 또는 new 로 시작 합 니 다.
2.인 스 턴 스 방법 중 autorelease,init,retain 또는 self 로 시작 합 니 다.
방법 이 있 는 유형의 대상 을 되 돌려 줍 니 다.이 방법 들 은 관련 되 돌아 오 는 유형 이 라 고 합 니 다.다시 말 하면 이러한 방법의 반환 결 과 는 방법 이 있 는 종 류 를 유형 으로 하고 아래 의 예 를 보십시오.
@interface NSObject  
+ (id)alloc;  
- (id)init;  
@end    
@interface NSArray : NSObject  
@end  
NSArray *array = [[NSArray alloc] init];  
     코코아 의 명명 규칙 에 따 르 면 문장[NSArray alloc]의 유형 은 NSArray*입 니 다.alloc 의 반환 유형 은 관련 반환 유형 에 속 하기 때 문 입 니 다.마찬가지 로[[NSArray alloc]init]의 반환 결과 도 NSArray*입 니 다.
-instancetype 역할
@interface NSArray  
+ (id)constructAnArray;  
@end 
        NSArray 를 다음 과 같이 초기 화 할 때:
[NSArray constructAnArray]; 코코아 의 방법 에 따라 규범 을 명명 하고 얻 은 반환 유형 은
방법 성명 의 반환 형식 과 같이 id 입 니 다.
.
@interface NSArray  
+ (instancetype)constructAnArray;  
@end
//    
+ (instancetype)newRegionWithName:(NSString *)regionName {
	APLRegion *newRegion = [[self alloc] init];
	newRegion.name = regionName;
	newRegion.mutableTimeZoneWrappers = [[NSMutableArray alloc] init];
	regions[regionName] = newRegion;
	return newRegion;
}

       위의 실제 예 self 는 방법 호출 자 를 대표 하고 APLRegion 류 를 나타 내 며 일반적인 상황 에서 대상 을 나타 내 는 것 과 다르다.
       NSArray 를 같은 방식 으로 초기 화 할 때:[NSArray constructAnArray];반환 형식 과 방법 이 있 는 클래스 의 유형 이 같 습 니 다.NSArray*입 니 다. .
       요약 하면 인 스 턴 트 type 의 역할 은 관련 이 없 는 유형 을 되 돌려 주 는 방법 입 니 다!
       장점:대상 의 유형 을 확인 할 수 있 고 컴 파일 러 가 코드 작성 문 제 를 검사 하 는 데 도움 을 줄 수 있 습 니 다.
비교:instancetype 과 id 의 공통점:-공통점:모두 방법의 반환 유형 으로 할 수 있 습 니 다.
--차이 점:1.instancetype 은 방법 과 같은 유형의 대상 을 되 돌려 줄 수 있 고 id 는 알 수 없 는 유형의 대상 만 되 돌려 줄 수 있 습 니 다.2.instancetype 은 반환 값 으로 만 사용 할 수 있 고 id 처럼 매개 변수 로 사용 할 수 없습니다.예 를 들 어 아래 의 쓰기:
- (void)setValue:(id)value     // instancetype       
{ ... }  

========================nil, Nil, NULL,NSNull========================
참고:http://blog.csdn.net/yhawaii/article/details/7442529
--nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) --Nil: A null pointer to an Objective-C class. --NULL: A null pointer to anything else, is for C-style memory pointers. ( #define NULL ((void *)0) ) NSNull: A class defines a singleton object used to represent null values in collection objects (which don't allow nil values). [NSNull null]: The singleton instance of NSNull.
         Technically they're all the same,but in practice they give someone reading your code some hints about what's going on; just like naming classes with a capital letter and instances with lowercase is recommended, but not required。
======================== static|전역 ========================
ps:구성원 변수:h 파일 에서@interface @end 에서 설명 하거나 m 파일 에서@implementation 에서@interface 를 사용 합 니 다. @end 추가;
        전역:@implementation 밖에서 정 의 된 변수(@implementation 에서 정의 해도 되 지만 일반적으로 이렇게 하지 않 습 니 다).
static int hu=3;//    
NSString*str1= @"str";//    
@implementation ViewController
@end 

       전역 변 수 는 두 가지 로 나 뉜 다.
  1) static 수식 은 개인 전역 변수 라 고도 부 릅 니 다.이 원본 파일 에서 만 static 를 사용 할 수 있 습 니 다.성명 의 클래스 에서 만 볼 수 있 습 니 다.Objective-C 의 문법 에서 설명 한 static 정적 변 수 는 다른 클래스 에서 클래스 이름 을 통 해 직접 접근 할 수 없습니다.그 역할 영역 은 설명 한 이.m 파일 에 만 있 을 수 있 습 니 다.그러나 이러한 방법 으로 이 정적 변수의 값 을 간접 적 으로 수정 할 수 있다.
        2)static 수식 이 없 는 것 은 모든 원본 파일 에서 사용 할 수 있 습 니 다.주의:static 이 없 는 전역 변 수 를 정의 합 니 다.이름 은 반드시 독특 해 야 다른 원본 파일 과 의 전역 변 수 를 구분 할 수 있 습 니 다.다른 원본 파일 과 같은 이름 의 전역 변수 가 나타 나 면 오류 가 발생 할 수 있 습 니 다.
undefined symbols for architecture x86_64:
"xx" ,referenced from:
      _main in main.0
ld:symbol(s) not found for architecture
clang:error:linker command failed with exit code 1
         다른 파일 에서 이 전역 변 수 를 사용 하려 면 앞 에 extern NSString*str 1 을 추가 합 니 다.사용 할 수 있 습 니 다. 。
비고:
       objective c 에서 정적 변 수 는 static 키 워드 를 사용 하여 정의 합 니 다. c 에서 static 역할 은'정적'이라는 뜻 으로 국부 변수 가 생존 주 기 를 바 꾸 고 전역 변수 가 그 역할 영역 을 바 꾸 는 역할 을 한다(생존 주기 가 이미 충분히 길다).c++와 달리 objective c 는 클래스 정적 구성원 변 수 를 지원 하지 않 습 니 다(즉,class variables 를 지원 하지 않 습 니 다).그러나 objective c 는 전역 변 수 를 지원 합 니 다.용법 은 c/c++와 같 습 니 다.따라서 OC 에서 static 의 간단 한 데이터 형식 에 대해 c 의 규칙 을 완전히 적용 합 니 다.static 류 변 수 는 c 규칙 을 참조 하고 역할 과 마찬가지 로 국부 적 으로 생존 주 기 를 바 꾸 고 전체적인 변화 역할 영역(유사 한 정적 구성원)을 참조 합 니 다.
         (개인 추측)왜 OC 에 서 는 정적 구성원 변 수 를 지원 하지 않 습 니까?static 을 충분히 통과 할 수 있 으 니까. + 클래스 전역 변 수 를 실현(그리고 편리 한 클래스 방법(+)으로 조작)하 는 것 은 단일 사례 나 다른 기능 을 실현 하 는 데 전혀 영향 을 주지 않 고 c 와 의 통일 도 실현 했다.

좋은 웹페이지 즐겨찾기