OC 기본 Category 및 Extension의 차이점
Category 및 Extension 소개
Category
원래의 방법은 여전히 존재한다. 결코 정말로 덮어씌운 것이 아니다.실행할 때 대상에게 메시지를 보내면 대상의'isa'지침에 따라 속하는 클래스를 찾은 다음에 클래스의 방법 목록에서 방법명에 따라 찾다가 첫 번째를 찾으면 되돌아오고category를 통해 추가한 방법은 방법 목록의 맨 위에 있기 때문에 클래스의 원래 방법을 찾을 기회가 없습니다."
property
를 통해 속성을 추가할 수 있으나 속성의 set, get 방법에 대한 설명일 뿐 실현되지 않고 밑줄을 가진 변수를 생성할 수 없습니다.Extension
.m
파일을 얻을 수 없기 때문입니다.이미 알고 있는 종류 때문에.m에서 조작하기 때문에 외부에 방법이나 변수를 숨겨서 사유로 만들 수 있다.차이점
eg: 사용자 정의
User
클래스에 Category, Extension 추가//Category
@interface User (InnterAdd)
-(void)test;
@end
@implementation User (InnterAdd)
-(void)test
{
NSLog(@":%s",__func__);
}
@end
//Extension
@interface User ()
@property (copy)NSString * addr;
@end
표현 형식상,Category는 명칭이 있고, 자신만의 것이 있다.m 파일, extension에는 이름이 없습니다. 익명으로 보이는 분류가 없습니다. 없습니다.m 파일.Category도 이름이 없으면 둘 다 표현할 수 있다.
Category:
는 실행할 때 불러오기 처리된 것으로 이 과정에서 추가된 방법을 클래스의 방법 목록에 추가한다. 클래스의 메모리 구조 구조는 컴파일 시기에 확정된 것이기 때문에 실행할 때 실례 변수를 추가할 수 없다. 그렇지 않으면 메모리 구조를 파괴한다(불법 메모리 주소에 예측할 수 없는 오류가 존재하기 때문에 금지된다).그럼 왜 방법을 추가할 수 있고 멤버 변수를 추가할 수 없나요?runtime층에서 category는 구조체 categoryt(objc-runtime-new.h에서 이 정의를 찾을 수 있음)는 다음과 같습니다.typedef struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceProperties;
} category_t;
이를 통해 실례 방법, 유형 방법, 심지어 협의를 실현하고 속성을 추가할 수 있음을 알 수 있다.실례 변수를 나타내는 저장이 없습니다.
사실 분류 자체는 하나의 클래스가 아니다. 분류, 분류의 일부 조작은 실행할 때 주요 클래스에 방법, 속성, 또는 협의의 조작이나 대외적으로 제공된 인터페이스 확장이다. 분류에 추가된 방법은 원래의 방법 목록에 직접 귀속된다.그래서 분류라는 이름을
로 바꾸는 것이 더 쉽게 이해할 수 있을 것 같아서(o)/~라는 점에서 Category와 Extension은 목적적으로 일치하고 기존의 클래스에 새로운 조작을 추가하는 것이다.Extension:
컴파일할 때 처리되는 첨가된 변수와 방법은 클래스와 밀접하게 결합되어 클래스의 일부분이며 클래스가 사라지면 클래스도 사라진다.Category의 연결 객체
runtime는 다음과 같은 세 가지 방법을 제공했다
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
objc_getAssociatedObject(id object, const void *key)
void objc_removeAssociatedObjects(id object)
그 중에서
objc_removeAssociatedObjects
추가된 모든 대상을 제거하기 때문에 실제 작업은 다른 곳에 추가된 관련도remove에 주지 않도록 주의해야 한다.그래서 objc_setAssociatedObject
를 통해nil로 직접 설치하는 것이 더 믿을 만하다.#END
이전 질문:OC 면접기초(1)-@property 키워드 및 수식자 알려주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.