runtime 의 기초 지식 을 알 고 싶다 면http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/기본 적 인 것 을 보 세 요. 프로젝트 에 한 페이지 의 데 이 터 를 로 컬 에 저장 해 야 했 습 니 다. 사실 이곳 은 여러 가지 방식 이 있 을 수 있 습 니 다. 저 는 압축 파일 을 연결 하 는 방식 으로 로 컬 에 저장 할 수 있 는 지 생각 했 습 니 다.(물론 이런 방식 이 가장 좋 은 것 은 아 닐 것 입 니 다. 마지막 으로 제 가 사용 한 것 은 sqlite 3 입 니 다. 이 건 조련 사로 하 겠 습 니 다)그러나 압축 파일 을 로 컬 에 저장 하려 면 미리 압축 파일 의 모든 속성 이 필요 합 니 다. 그러나 이런 속성 들 이 많 을 수 있 습 니 다. 그래서 저 는 예전 처럼 모든 속성 을 꺼 내 압축 파일 을 연결 할 수 없습니다. 그러면 너무 귀 찮 습 니 다. 이때 저 는 runtime 을 사용 하여 동적 으로 실 행 될 때 이 문 제 를 해결 하 는 것 이 바로 runtime 중의 것 이 라 고 생각 했 습 니 다.
Runtime 을 사용 하여 대상 의 모든 속성//파일 읽 기 데이터 획득
(instancetype)initWithCoder:(NSCoder )aDecoder { if (self = [super init]) {/OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)Class cls 는 그 종류의 속성 목록 unsigned int * outCount 를 가 져 와 속성 개 수 를 저장 하 는 데 사용 합 니 다 */unsigned int property Count = 0; obbc property t * propertys = class copy Property List (objectClass, & property Count);
for (int i = 0; i < count; i++) {
// key key c key
objc_property_t property = propertys[i];
const char *propertyName = property_getName(property);
// oc
NSString *strName = [NSString stringWithUTF8String:propertyName];
//
id value = [aDecoder decodeObjectForKey:strName];
// KVC
[self setValue:value forKey:strName];
}
free(ivar);
} return self;}//압축 파일 저장 데이터
(void) encodeWitCoder: (NSCoder *) aCoder {unsigned int count; Ivar * ivar = class copyIvarList ([selfclass], & count); for (int i = 0; i < cout; i++) {Ivar iv= iva []; const charcharchar* name = iva getName (iv); NSString * strName = [NSString string 문자열 Wit8String: name];//KVC값 을 가 져 오 는 id 값 값 값 값 을 사용 합 니 다 = [selfvalue ForKey값 값: strName]; Name: StriStriStriString * strName = [NSString string String String String String StriStriString: String: Name: name];;//////[Coder encodeObject: value for Key: strName];} free (ivar); 마지막 으로 free (ivar) 를 사용 하 는 것 을 볼 수 있 습 니 다.이것 은 C 가 OC 에 적합 하지 않 은 ARC 입 니 다. ivar 는 malloc 가 만 들 었 기 때문에 free 가 필요 합 니 다. 그렇지 않 으 면 메모리 가 새 어 나 갑 니 다. 위의 압축 파일 과 해 제 는 모델 에서 이 루어 집 니 다. 여러 종류의 로 컬 데 이 터 를 저장 하려 면 공공 클래스 를 써 서 클래스 이름 을 전달 한 다음 runtime 방법 class addMethod (encoderClass, @ selector) 를 사용 할 수 있 습 니 다.(encodeWithCoder:), (IMP)run , "v@:@"); 동적 으로 이런 방법 을 추가 하면 여러 가지 종 류 를 동적 으로 제어 하여 압축 파일 을 연결 할 수 있 습 니 다. 그러면 훨씬 편리 합 니 다. 위의 runtime 을 보면 json 데 이 터 를 분석 할 때 json 에 데이터 가 너무 많 으 면 runtime 으로 이 번 거 로 운 문 제 를 해결 할 수 있 습 니 다. 사실은 위 와 같은 사고 입 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: