iOS RunTime 분석

2719 단어
1. 런타임이란 무엇인가
Time이 실행될 때objective-c는 실행될 때의 언어입니다. 실행될 때는 프로그램이 실행될 때 우리의 대상의 유형과 호출 클래스와 대상이 대응하는 방법을 확인하는 것입니다.
2. 런타임의 사용
RunTime은 프로그램이 실행될 때만 우리의 대상 유형을 정하고 호출 클래스와 대상에 대응하는 방법, 속성 등을 정하기 때문에 우리는 프로그램이 실행될 때 대상의 속성, 방법, 수정 클래스를 수정할 수 있다.
3. 런타임의 구현
Animal *a = [[Animal alloc] init];  
[a eat];//eat 
// 
[a performSelector:@selector(eat)];
objc_msgSend(a,@selector(eat));
// 
[Animal eat];
// 
Class animalClass = [Animal class];
[[Animal class] performSelector(eat)];
objc_msgSend(animalClass,@selector(eat));

우리가 호출하는 방법에서 끝까지 실행하는 순서는 다음과 같다. 실례적인 방법의 호출이고, 그 다음에perform Selector를 실행한다. 그리고objcmsgSend.
4. RunTime의 사용 장면
  • 1. RunTime을 사용하여 방법을 바꾼다.흔히 볼 수 있는 예이다. 우리가 그림을 불러올 때, 그림을 불러온 후에 이 그림이 비어 있는지 판단하고, 비어 있으면 error를 출력해야 한다.우리는 먼저 분류를 사용해서 하는 것을 생각했다. 분류를 사용해서 하는 것은 문제가 없다. 전제는 당신이 코드를 많이 쓰지 않았다는 것이다. 만약에 당신의 프로젝트가 매우 방대하다면 당신이 그림을 불러오는 방법을 전부 다시 수정할 수 없을 것이다. 그래서 분류를 사용하는 것은 안 되는 것이 아니라 매우 불편하다. 그러면 우리는 어떻게 해야 합니까?우리가 앉을 것은 분류 안에서 우리의 방법을 바꾸는 것이다.우선 우리가 원래 그림을 불러오는 방법을 바꾸는 방법을 써야 한다.
  • +(UIImage *)judgeImageName:(NSString *)name{
      UIImage \*image = [UIImage imageNamed:name];
      if (image == nil) {
          NSLog(@"error");
      }
      return image;
    }  
    

    //그리고 분류된 + (void)load;방법
    +(void)load{
      Method imageNamedMethod = class_getClassMethod([UIImage class],@selector(imageNamed));
      Method judgeimageNamedMethod = class_getClassMethod([UIImage class],@selector(judgeImageName));
      Method_exchangeImplementations(imageNamedMethod,judgeimageNamedMethod);
    }
    

    주의해야 할 것은 우리가 이런 방법을 사용해서 방법을 바꾼 후에 우리가 분류에 쓴 방법을 사용할 수 없다는 것이다. 왜냐하면 네가 이 방법을 사용했기 때문이다. 이 방법은 원래의 방법을 사용했고 원래의 방법은 우리가 쓴 방법을 사용했기 때문이다. 그러면 이것은 죽은 순환이다.
  • 2. RunTime을 사용하여 속성 분류를 추가하는 것은 기본적으로 속성을 추가할 수 없습니다. @property로 속성을 설명해도 이 속성의 set과 get은 속성만 설명할 뿐 실현되지 않습니다.하지만 런타임을 사용하여 분류에 속성을 추가할 수 있습니다.
  • @property (nonatomic, strong)NSString *age
    
    -(void)setAge:(NSString *)name{
    objc_setAssociatedObject(self,@"age",age,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    objc_setAssociatedObject 중의 매개 변수: 첫 번째 매개 변수는 어디에 이 속성을 추가하는가이다. 여기는self 두 번째 매개 변수가 속성이고 세 번째 매개 변수가 속성이고 네 번째 매개 변수가 속성인 형식이다. 일반적으로 다음과 같은 몇 가지가 있다.
    OBJC_ASSOCIATION_ASSIGN = 0, // 
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, // , 
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, // , 
    OBJC_ASSOCIATION_RETAIN = 01401, // ,  
    OBJC_ASSOCIATION_COPY = 01403   // , 
    }
    
    -(NSString *)age{
    objc_getAssociatedObject(self,@"age");
    }
    
    objc_getAssociatedObject의 매개 변수: 첫 번째 매개 변수는 어느 대상에 연결된 속성을 가져오는 것입니다.두 번째 매개 변수는 왜 속성인지, 사실은 속성 이름이다.

    좋은 웹페이지 즐겨찾기