cocoa의 고급 개발 런타임 초급 기본 변수

###iOS 개발 기간도 짧지 않으니 보고 들은 것을 꺼내서 공유할 때가 됐어요.

객체 복제본:

id object_copy(id obj, size_t size) //   
id object_dispose(id obj)
TsetClass *obj = [TsetClassnew];
id objTest =object_copy(obj,sizeof(obj));

(lldb)po &obj 0x00007fff54a7cb08(lldb)po &objTest 0x00007fff54a7cb00 의심할 여지없이 인쇄한 메모리 주소는 같지 않습니다. 이 방법은 바늘의 깊은 복사와 유사합니다.

깊이 복사 및 얕은 복사

  • 깊이 복사와 얕은 복사는 복제 대상 자체를 복제하고 대상의 속성, 포함된 대상은 복제하지 않는다.객체의 등록 정보 및 기타 객체를 포함하여 전체 복사합니다.Foundation 프레임워크는 복제를 지원하는 클래스입니다. 기본값은 얕은 복제입니다.
  • 대상의 사용자 정의 복사 대상은 복제 특성을 가지고 NSCopying, NSMutable Copying 프로토콜, 이 프로토콜을 실현하는 copy WithZone 방법과 mutable Copy WithZone 방법을 실현해야 한다.깊은 복사와 얕은 복사의 차이는 코피 WithZone 방법의 실현objectdispose(objTest);//[objTest release]와 같습니다.이 방법은 런타임에 대한 봉인일 뿐입니다.[objTest release]를 다시 실행하면 어떤 오류가 발생했는지 알 수 있습니다.

  • list:TestRuntime(1034,0x111b66300) malloc: * error for object 0x7ffe1a75b940: pointer being freed was not allocated

    객체의 클래스 변경/객체 가져오기 클래스

  • 변경 대상의 클래스
  • TsetClass *obj1 = [TsetClass new]; 
    Class aClass =object_setClass(obj1, [CustomClassOther class]);
    
    (lldb)po obj1
    <CustomClassOther: 0x7f8e4bd14480>
    
    (lldb) po aClass
    TsetClass
     0.0.
  • 대상을 획득하는 클래스
  • TsetClass *obj2 = [TsetClass new];
    Class aLogClass =object_getClass(obj2);
    
    (lldb) po aLogClass
    TsetClass
    
    NSString *className = [NSStringstringWithCString:object_getClassName(obj2)encoding:NSUTF8StringEncoding];
    NSLog(@"className:%@", className);
    
    (lldb) po className
    TsetClass
  • 클래스에 추가하는 방법
  • BOOL class_addMethod(Class cls,SEL name,IMP imp,    const char *types)
    TsetClass *instance = [[TsetClassalloc]init];
    
     
    class_addMethod([TsetClass class],@selector(ocMethod:), (IMP)cfunction,"i@:@");
    
    if ([instance respondsToSelector:@selector(ocMethod:)]) {
            NSLog(@"Yes, instance respondsToSelector:@selector(ocMethod:)");
        } else
        {
            NSLog(@"Sorry");
        }
        int a = (int)[instance ocMethod:@" OC method,C "];
        NSLog(@"a:%d", a);
        int cfunction(id self, SEL _cmd, NSString *str) {
        NSLog(@"%@", str);
        return 520;// 
    }
  • 하나의 클래스를 획득하는 모든 방법/모든 속성이 하나의 클래스를 획득하는 모든 방법
  • u_int count;
    Method* methods= class_copyMethodList([UIViewController class], &count);
    for (int i = 0; i < count ; i++) { SEL name = method_getName(methods[i]); NSString *strName = [NSString stringWithCString:sel_getName(name)encoding:NSUTF8StringEncoding]; // NSLog(@"%@",strName); }

    하나의 클래스의 모든 속성 가져오기
    u_int count;
    objc_property_t *properties=class_copyPropertyList([TsetClass class], &count);
    for (int i = 0; i < count ; i++) {
        const char* propertyName =property_getName(properties[i]);
            NSString *strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
            NSLog(@"%@",strName);
        }
  • 전역 변수의 값 가져오기(myFloat는 클래스의 속성 변수)
  • float myFloatValue;
    object_getInstanceVariable(self,"myFloat"(void*)&myFloatValue);
    NSLog(@"%f", myFloatValue);
  • 글로벌 변수의 값 설정
  • float newValue = 10.00f;
    unsigned int addr = (unsigned int)&newValue;
    object_setInstanceVariable(self,"myFloat", *(float**)addr);

    좋은 웹페이지 즐겨찾기