iOS:Objective-C 키워드 1
9737 단어 Objective-C키워드superself
========================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 alloc]의 유형 은 NSArray*입 니 다.alloc 의 반환 유형 은 관련 반환 유형 에 속 하기 때 문 입 니 다.마찬가지 로[[NSArray alloc]init]의 반환 결과 도 NSArray*입 니 다.NSArray *array = [[NSArray alloc] init];
-instancetype 역할NSArray 를 다음 과 같이 초기 화 할 때:@interface NSArray + (id)constructAnArray; @end
[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 이 없 는 전역 변 수 를 정의 합 니 다.이름 은 반드시 독특 해 야 다른 원본 파일 과 의 전역 변 수 를 구분 할 수 있 습 니 다.다른 원본 파일 과 같은 이름 의 전역 변수 가 나타 나 면 오류 가 발생 할 수 있 습 니 다.다른 파일 에서 이 전역 변 수 를 사용 하려 면 앞 에 extern NSString*str 1 을 추가 합 니 다.사용 할 수 있 습 니 다. 。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
비고:
objective c 에서 정적 변 수 는 static 키 워드 를 사용 하여 정의 합 니 다. c 에서 static 역할 은'정적'이라는 뜻 으로 국부 변수 가 생존 주 기 를 바 꾸 고 전역 변수 가 그 역할 영역 을 바 꾸 는 역할 을 한다(생존 주기 가 이미 충분히 길다).c++와 달리 objective c 는 클래스 정적 구성원 변 수 를 지원 하지 않 습 니 다(즉,class variables 를 지원 하지 않 습 니 다).그러나 objective c 는 전역 변 수 를 지원 합 니 다.용법 은 c/c++와 같 습 니 다.따라서 OC 에서 static 의 간단 한 데이터 형식 에 대해 c 의 규칙 을 완전히 적용 합 니 다.static 류 변 수 는 c 규칙 을 참조 하고 역할 과 마찬가지 로 국부 적 으로 생존 주 기 를 바 꾸 고 전체적인 변화 역할 영역(유사 한 정적 구성원)을 참조 합 니 다.
(개인 추측)왜 OC 에 서 는 정적 구성원 변 수 를 지원 하지 않 습 니까?static 을 충분히 통과 할 수 있 으 니까. + 클래스 전역 변 수 를 실현(그리고 편리 한 클래스 방법(+)으로 조작)하 는 것 은 단일 사례 나 다른 기능 을 실현 하 는 데 전혀 영향 을 주지 않 고 c 와 의 통일 도 실현 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PreferenceBundle에서 오른쪽 상단에 Respring 버튼을 클릭합니다.만나서 반갑습니다, Minazuki라고합니다. 프로필 이름 : Minazuki_dev Twitter : Repo : 아직 중학생이므로 말이 이상한 곳이 있습니다만 용서해 주세요… 🙏 theos (Mac이든 단품이든 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.