Objective-C의 KVO 및 KVC 메커니즘을 인스턴스로 설명합니다.

6508 단어 Objective-C
KVO 인스턴스 분석
최근 문제가 발생했습니다. 프로젝트의 댓글 인터페이스를 처리할 때 UIWebView 디스플레이 댓글 목록을 직접 사용했기 때문에 찾은 페이지 위아래에 CGSize(320,65)의 엉망진창인 광고가 있습니다.헤드 광고는 헤드 좌표에 자신의 로고를 붙이는 것이 편리하기 때문에 해결되었지만 꼬리 부분의 댓글이 길고 짧기 때문에 좌표도 다르다. 그러면 죽은 좌표를 정해서 로고를 붙일 수 없다. 생각한 후에 KVO를 통해 이 문제를 잘 해결했다.
@KVO 개요:
KVO, 즉: Key-Value Observing은 지정한 대상의 속성이 수정되면 대상이 알림을 받을 수 있는 메커니즘을 제공합니다.
쉽게 말하면 관찰된 대상의 속성이 수정될 때마다 KVO는 자동으로 해당 관찰자에게 통지한다.
다음 절차를 사용합니다.
1. 등록, 피관찰자의 속성을 지정,
2. 리셋 방법 구현
3. 리셋 트리거 방법
4. 관찰 제거
코드 인스턴스:

-(void)viewDidLoad{ 
 
    // KVO, , "contentSize" ,  
    [_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL]; 

 
//   
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context 

    if(object == _webView.scrollView && [keyPath isEqualToString:@"contentSize"]) 
    { 
        //  Y  
        CGSize size = _webView.scrollView.contentSize; 
       
        if (size.height > 568.0) { 
             
            //  
            _hideBottomImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, size.height-67, ScreenWidth, 67)]; 
            _hideBottomImage.image = [UIImage imageNamed:@"banner"]; 
            [_webView.scrollView addSubview:_hideBottomImage]; 
            [_hideBottomImage release]; 
        } 
    } 
    else 
    { 
        //   
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 

 
- (void)dealloc{//----> ARC dealloc , [super dealloc] 
 
    // KVO,   
    [_webView.scrollView removeObserver:self forKeyPath:@"contentSize"]; 
    [super dealloc];   
 
위쪽은 contentSize 속성에 대한 것이고 다른 속성은 이와 같습니다.
KVC
일반적으로 우리는 속성의 set과 get 방법을 통해 값을 부여하고 추출합니다. 여기서 Key-Value-Coding(KVC) 키 값 인코딩으로 클래스의 속성에 값을 부여하고 추출하는 것을 소개합니다.
1. 기본 방식(setValue:forKey:valueForKey)

//  --- Student (.m ) 
#import <Foundation/Foundation.h> 
 
 
@class HMTClass; 
@interface HMTStudent : NSObject{ 
 
    NSString * _name; 
    
    BOOL _test; 
    BOOL _isTest; 
    BOOL test; 
    BOOL isTest; 
 

 
@property (nonatomic,copy)NSString * name; 
@property (nonatomic,copy)NSString * sex; 
@property (nonatomic,assign)NSInteger age; 
@property (nonatomic,strong) HMTClass * hmtClass; 
 
@end 
 
//  ---main  
HMTStudent * student = [[HMTStudent alloc] init]; 
     
student.hmtClass = [[HMTClass alloc] init]; 
student.name = @"humingtao”;     //  set
   
//  KVC     
[student setValue:@“mawei is dog" forKey:@"name”];  
[student setValue:@"m" forKey:@"sex"]; 
[student setValue:@(10) forKey:@"age"]; 
//       
NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,[student valueForKey:@"name"]); 
 
참고:
클래스에서 KVC 액세스 속성 키 순서를 검증하기 위해 4개의 BOOL 값 변수를 정의했습니다.
       [student setValue:@(YES) forKey:@"test”]; 
 
결과:_test―>_isTest―>test―>isTest 
2. 키 경로 액세스(클래스의 속성에 대한 setValue: ForKeyPath: forKeyPath)

//   
@interface HMTClass : NSObject 
 
@property (nonatomic,copy)NSString * name; 
 
@end 
 
그리고 앞의 첫 번째 점에서 Student 클래스에 학급 속성 hmt Class를 썼어요.
  
HMTClass *hmtClass = [[HMTClass alloc]init]; 
[hmtClass setValue:@" " forKey:@"name"]; 
[student setValue:hmtClass forKey:@"hmtClass"]; 
NSString *hmtClassName = [student valueForKeyPath:@"hmtClass.name"]; 
 
//  
[student setValue:@" " forKeyPath:@"hmtClass.name"]; 
student.hmtClass.name = [student valueForKeyPath:@"hmtClass.name"]; 
3. 기본 데이터 유형 자동 봉인
우리는 Student 클래스에 분수 속성 NSInteger number 학호를 추가합니다.

#import <Foundation/Foundation.h>   
@class HMTClass;   
@interface HMTStudent : NSObject   
{   
    NSString *_name;   
 
    NSInteger number;   
}   
@end   
 
[student setValue:@"100" forKeyPath:@"number"];   
NSString *number = [student valueForKey:@"number"];   
NSString* 유형으로 설정된 속성 값이 @ "100"인 것을 알 수 있습니다. 저희 속성은 NSInteger 유형으로 접근에 문제가 없습니다. 
4. 조작 집합
Student 클래스에 NSArray를 추가하여 다른 학생을 나타냅니다.

#import <Foundation/Foundation.h>   
@class HMTClass;   
@interface HMTStudent : NSObject   
{   
    NSArray *manyStudents;   
}   
@end   
           
Student *student1 = [[HMTStudent alloc]init];   
Student *student2 = [[HMTStudent alloc]init];   
Student *student3 = [[HMTStudent alloc]init];   
[student1 setValue:@"200" forKey:@"number"];   
[student2 setValue:@"300" forKey:@"number"];   
[student3 setValue:@"400" forKey:@"number"];   
NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];   
[student setValue:array forKey:@"manyStudents"];   
NSLog(@"%@",[student valueForKeyPath:@"manyStudents.number"]);  

인쇄는 배열(200300400)입니다.

좋은 웹페이지 즐겨찾기