KVO 예제에 대한 간단한 분석
최근 프로젝트에서 댓글 인터페이스를 다룰 때 UIWebView를 직접 사용하여 댓글 목록을 표시하기 때문에 내가받은 페이지에 CGSize (320, 65)가 지저분한 광고가있었습니다. . 일부 광고는 헤드 좌표에 자체 로고를 붙여 넣기에 매우 편리하지만 결국 각 페이지의 댓글 길이가 다르기 때문에 좌표도 다르므로 로고에 붙여 넣기 위해 죽은 좌표를 줄 수는 없습니다. ,이 문제는 KVO를 통해 잘 해결됩니다.
@kvo 개요 :
KVO, 즉 키 값 관찰은 지정된 객체의 속성이 수정되면 객체에 알림을 제공한다는 메커니즘을 제공합니다.
간단히 말해서, 지정된 관찰 된 객체의 속성이 수정 될 때마다 KVO는 해당 관찰자에게 자동으로 알립니다.
사용할 단계는 다음과 같습니다.
1. 레지스터, 관찰자의 속성을 지정하십시오.
2. 콜백 메소드 구현
3. 트리거 콜백 메소드
4. 관찰을 제거하십시오
코드 예 : 코드를 다음과 같이 복사하십시오.
-(void) viewDidload {
// kvo, 옵저버로서, 속성 "contentsize"가 변경되는 한, 콜백 메소드는 알립니다.
[_webview.scrollview addobserver : self kekeypath :@"contentsize"옵션 : nskeyValueObservingOptionNew 컨텍스트 : null];
}
// 콜백 메소드
- (void) ObserveValueforkeyPath : (nsstring *) kyypath ofobject : (id) 객체 변경 : (nsdictionary *) 컨텍스트 변경 : (voidvoid *) 컨텍스트
{{
if (object == _webview.scrollview && [kyypath 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 :@"배너"];
[_webview.scrollview addSubview : _hidebottomimage];
[_hidebottomimag 릴리스];
}
}
또 다른
{{
// 부모 클래스 메소드를 호출합니다
[Super ObserveValueforkeyPath : Kyypath ofobject : 객체 변경 : 변경 상황 : 컨텍스트];
}
}
-(void) Dealloc {// ---> 아크 환경에서 Dealloc 메소드를 호출 할 수도 있지만 [Super Dealloc]를 작성할 필요는 없습니다.
// KVO를 제거하면 리소스 누출이 발생합니다
[_webview.scrollview removeobserver : self kepoypath :@"contentsize"];
[슈퍼 딜로];
}
위의 내용은 Contentsize 속성이며 다른 속성은 유사합니다.
KVC
일반적으로, 우리는 모두 세트를 통해 값을 할당하고 얻습니다. 여기서 KVC (Key-Value-Coding) 키-값 인코딩을 사용하여 클래스의 속성에 값을 가져옵니다. .
1. 기본 방법 (setValue : forkey : valueforkey)
다음과 같이 코드 코드를 복사하십시오.
// --- 학생 클래스 정의 (.M 파일에는 조작이 없음)
#import <Foundation/Foundation.h>
@class hmtclass;
@Interface hmtstudent : nsObject {
nsstring * _name;
bool _test;
bool _istest;
부울 테스트;
bool istest;
}
@property (비 원자, 복사) nsstring * 이름;
@property (비 원자, 복사) nsstring * 섹스;
@property (비 원자, 할당) nsinteger Age;
@property (비 원자, 강함) hmtclass * hmtclass;
@끝
// --- 기본 파일
hmtstudent * Student = [[hmtstudent alloc] init];
Student.hmtclass = [[HmtClass alloc] init];
학생 .name = @"Humingtao";
// KVC 할당
[Student setValue :@"Mawei is Dog"Forkey :@"name"];
[학생 setValue :@"m"forkey :@"sex"];
[학생 setValue :@(10) forkey :@"age"];
// 값을 얻습니다
nslog (@"%s __%d__ |%@", __ 함수 __, __ line __, [학생 valueforkey :@"name"]);
특별한 관심 :
KVC 액세스 속성 키의 순서를 확인하기 위해 클래스에서 4 bool 값 변수를 정의했습니다.
[Student setValue :@(예) Forkey :@"Test"];
결과는 다음과 같습니다. _test -> _ istest -> test -> istest
2. 키 경로 액세스 (setValue : orkeyPath : ForkeyPath)
다음과 같이 코드 코드를 복사하십시오.
// 클래스 클래스를 만듭니다
@interface hmtclass : nsobject
@property (비 원자, 복사) nsstring * 이름;
@끝
그런 다음 위의 첫 번째 지점에서 클래스 속성 HMTClass가 학생 수업에 작성됩니다.
다음과 같이 코드 코드를 복사하십시오.
hmtclass *hmtclass = [[hmtclass alloc] init];
[hmtclass setValue :@"Cosmic Class 1"Forkey :@"name"];
[학생 setValue : hmtclass forkey :@"hmtclass"];
nsstring *hmtclassname = [학생 ValueForkeyPath :@"hmtclass.name"];
// 이와 같이 값을 저장할 수 있습니다
[Student setValue :@"Cosmic Class 1"ForkeyPath :@"hmtclass.name"];
Student.hmtclass.name = [학생 ValueForkeyPath :@"hmtclass.name"];
3. 기본 데이터 유형을 자동으로 캡슐화합니다.
다음과 같이 코드 코드를 복사하십시오.
#import <Foundation/Foundation.h>
@class hmtclass;
@interface hmtstudent : nsobject
{{
nsstring *_name;
nsinteger 번호;
}
@끝
[Student setValue :@"100"FekyPath :@"number"];
nsstring *number = [Student ValueForkey :@"number"];
nsstring* type @"100"으로 설정된 속성 값은 NSinteger 유형이므로 액세스에 문제가 없습니다.
4. 다른 학생들을 대표하기 위해 배열 nsarray를 학생 수업에 추가하십시오.
다음과 같이 코드 코드를 복사하십시오.
#import <Foundation/Foundation.h>
@class hmtclass;
@interface hmtstudent : nsobject
{{
Nsarray *많은 학생들;
}
@끝
Student *Student1 = [[Hmtstudent alloc] init];
Student *Student2 = [[hmtstudent alloc] init];
학생 *학생 3 = [[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 (@"%@", [학생 ValueForkeyPath :@"manystudents.number"]);
인쇄 된 배열 (200,300,400)