당신이 나를 사랑하지 않을 때 나에게 말해 주세요 (KVC/KVO/NSNotification)
KVC KVO NSNotification
KVC
setValue: forKey:
를 통해 객체의 값을 설정합니다.valueForKey:
를 통해 대상의 값을 얻는다.setValue: forKeyPath:
로 설정합니다.valueForKeyPath:
를 통해 지정된 경로의 객체 값을 가져옵니다.예제 코드는 다음과 같습니다.
```objc
//Person.h
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) Person *girlFriend;
@property (nonatomic, copy) NSArray *books;
@end
```
```objc
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc] init];
NSLog(@"1: %@ - %ld", person.name, person.age);
[person setValue:@"Bourne" forKey:@"name"];
[person setValue:@21 forKey:@"age"];
NSLog(@"2: %@ - %ld", [person valueForKey:@"name"], person.age);
Person *girl = [[Person alloc] init];
[person setValue:girl forKey:@"girlFriend"];
NSLog(@"3: %@ - %ld", [person valueForKeyPath:@"girlFriend.name"], person.girlFriend.age);
[person setValue:@"willYou?" forKeyPath:@"girlFriend.name"];
[person setValue:@20 forKeyPath:@"girlFriend.age"];
NSLog(@"4: %@ - %ld", person.girlFriend.name, person.girlFriend.age);
}
```
** **
```
2015-04-06 16:49:19.192 KVC-KVO-test[5685:7429728] 1: (null) - 0
2015-04-06 16:49:19.193 KVC-KVO-test[5685:7429728] 2: Bourne - 21
2015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 3: (null) - 0
2015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 4: willYou? - 20
```
예제 코드는 다음과 같습니다.
//Book.h
@interface Book : NSObject
@property (nonatomic, assign) NSInteger price;
@end
- (void)setAndGetBooks {
Person *person = [[Person alloc] init];
Book *book1 = [[Book alloc] init];
Book *book2 = [[Book alloc] init];
Book *book3 = [[Book alloc] init];
NSArray *myBooks = @[book1, book2, book3];
[person setValue:myBooks forKey:@"books"];
NSLog(@"1: %@", [person valueForKeyPath:@"books.price"]);
[person setValue:@1 forKeyPath:@"books.price"];
NSLog(@"2: %@", [person valueForKeyPath:@"books.price"]);
}
인쇄 출력 2015-04-06 17:12:48.256 KVC-KVO-test[5886:7519923] 1: (
0,
0,
0
)
2015-04-06 17:12:48.257 KVC-KVO-test[5886:7519923] 2: (
1,
1,
1
)
2. KVO
addObserver:forKeyPath:options:context:
메시지를 피관찰자에게 보내야 한다.관찰이 필요한 대상과 관찰이 필요한 속성을 전달하는 관건적인 경로로 선형 파라미터는 변경이 발생할 때 관찰자에게 제공하는 정보를 지정하고 NSKeyValueObservingOptionNew
를 사용하면 리셋 방법에서 옛 값을 얻을 수 있으며 NSKeyValueObservingOptionOld
를 사용하면 리셋 방법에서 새로운 값을 얻을 수 있다.예제[person addObserver:self forKeyPath:@"books.price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
observeValueForKeyPath: ofObject: change: context:
메시지를 받을 수 있다.관찰을 촉발하는 대상, 키 경로, 변화의 세부 사항을 포함하는 사전은 관찰자에게 전달된다. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"books.price"]) {
NSLog(" !");
}
}
[person removeObserver:self forKeyPath:@"books.price"];
3. NSNotification
observeValueForKeyPath: ofObject: change: context:
방법을 사용하고 NSNotification은 필요할 때 스스로 알림을 보내야 호출하며 방법이 사용자 정의된다.[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(action:) name:@"NOTIFICATION_NAME" object:nil];
NSObject *test = [[NSObject alloc] init];
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION_NAME" object:test];
// :
NSNotification *notification = [NSNotification notificationWithName:@"NOTIFICATION_NAME" object:test];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- (void)action:(NSNotification *)notification {
NSLog(" !");
}
설명:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.