Uma breve análise dos exemplos de KVO
Eu encontrei um problema recentemente. . Este problema é bem resolvido através do KVO.
Visão geral @kvo:
KVO, isto é, observação do valor-chave, fornece um mecanismo de que, quando os atributos do objeto especificado são modificados, o objeto será notificado.
Simplificando, toda vez que os atributos do objeto observado especificado são modificados, o KVO notificará automaticamente o observador correspondente.
As etapas para uso são as seguintes:
1. Registre -se, especifique os atributos do observador,
2. Implementar o método de retorno de chamada
3. Método de retorno de chamada de gatilho
4. Remova a observação
Exemplo de código: copie o código da seguinte forma:
-(void) ViewDidload {
// KVO, como observador, desde que a propriedade "contentSize" mude, o método de retorno de chamada notificará
[_WebView.ScrollView AddObServer: Self ForKeypath:@"contentSize" Opções: NSKEYVALUEOBSERVINGOPTIONNEW Contexto: NULL];
}
// Método de retorno de chamada
- (void) ObserveValueForKeypath: (NSString *) Keypath OfObject: (id) Mudança de objeto: (nsdictionary *) Alterar contexto: (Voidvoid *) Contexto
{
if (object == _WebView.ScrollView && [Keypath isequaltoString:@"contentsize"]))
{
// Obtenha a coordenada máxima y
Cgsize size = _webview.scrollView.contentsize;
if (size.Height> 568.0) {
// bloquear anúncios
_hidebottomImage = [[uiImageView aloc] initwithFrame: cgrectmake (0, size.height-67, screenwidth, 67)];
_hidebottomImage.image = [uiimage imageNamed:@"Banner"];
[_WebView.ScrollView AddSubView: _hidebottomImage];
[_hidebottomimag liberação];
}
}
outro
{
// Ligue para o método da classe pai
[Super ObserveValueForKeypath: Keypath OfObject: Mudança de objeto: Alterar contexto: contexto];
}
}
-(void) Dealloc {// ---> Você também pode chamar o método Dealloc no ambiente ARC, mas não precisa escrever [Super Dealloc]
// Remova o KVO, caso contrário, causará vazamento de recursos
[_WebView.ScrollView RemofObServer: self forkeypath:@"contentsize"];
[Super Dealloc];
}
O exposto acima é para a propriedade ContentSize e outras propriedades são semelhantes.
KVC
Geralmente, todos atribuímos e obtemos valores através do conjunto e obtemos métodos de atributos. .
1. Método básico (SetValue: Forkey: ValueForKey)
A cópia do código é a seguinte:
// --- Defina uma aula de estudante (não há operação no arquivo .m)
#import <fundação/fundação.h>
@class hmtclass;
@Interface hmtstudent: nsObject {
NSString * _name;
Bool _test;
Bool _istest;
Teste bool;
BOOL ISTEST;
}
@property (não atômico, cópia) NSString * nome;
@property (não atômico, cópia) nsstring * sexo;
@Property (não atômico, atribuir) Idade do NSINTEGER;
@Property (não atômico, forte) hmtclass * hmtclass;
@fim
// --- arquivo principal
Hmtstudent * aluno = [[hmtstudent aloc] init];
estudante.hmtclass = [[hmtclass aloc] init];
Student.Name = @"Humingtao";
// Tarefa KVC
[Student SetValue:@"mawei é cachorro" forkey:@"name"];
[Student SetValue:@"M" Forkey:@"Sex"];
[Student SetValue:@(10) Forkey:@"Age"];
// Obtenha o valor
NSLog (@"%s __%d__ |%@", __ função __, __ linha __, [estudante valueforkey:@"name"]);
Atenção especial:
Eu também defini 4 variáveis de valor BOOL na classe para verificar a ordem das teclas de atributo de acesso KVC
[Student SetValue:@(sim) Forkey:@"test"];
O resultado é: _test ―> _ ISTEST -> teste -> ISTEST
2. Acesso ao caminho da chave (usado para atribuir o SetValue: Forkeypath: Forkeypath)
A cópia do código é a seguinte:
// Crie uma classe
@Interface hmtclass: nsObject
@property (não atômico, cópia) NSString * nome;
@fim
Então, no primeiro ponto acima, um atributo de classe HMTClass está escrito na aula de estudantes.
A cópia do código é a seguinte:
Hmtclass *hmtclass = [[hmtclass aloc] init];
[hmtclass setValue:@"Cosmic Class 1" forkey:@"name"];
[Student SetValue: hmtclass forkey:@"hmtclass"];
NSString *hmtclassName = [Student ValueForKeypath:@"hmtclass.name"];
// você pode salvar o valor como este
[Student SetValue:@"Cosmic Class 1" Forkeypath:@"hmtclass.name"];
estudante.hmtclass.name = [Student ValueForKeypath:@"hmtclass.name"];
3. Encapsula automaticamente os tipos de dados básicos.
A cópia do código é a seguinte:
#import <fundação/fundação.h>
@class hmtclass;
@Interface hmtstudent: nsObject
{
NSString *_name;
Número nsinteger;
}
@fim
[Student SetValue:@"100" Forkeypath:@"número"];
NsString *número = [Valor do alunoforMekey:@"número"];
Pode -se observar que o valor do atributo definido com NSString* tipo @"100" e nosso atributo é do tipo nsinteger, portanto não há problema com o acesso.
4. Adicione uma matriz NSARRAY à aula de estudante para representar outros estudantes.
A cópia do código é a seguinte:
#import <fundação/fundação.h>
@class hmtclass;
@Interface hmtstudent: nsObject
{
Nsarray *muitos estudos;
}
@fim
Aluno *aluno1 = [[hmtstudent aloc] init];
Estudante *aluno2 = [[hmtstudent aloc] init];
Estudante *aluno3 = [[hmtstudent aloc] init];
[Student1 setValue:@"200" forkey:@"número"];
[Student2 SetValue:@"300" forkey:@"número"];
[Student3 setValue:@"400" forkey:@"número"];
NSARRAY *Array = [NSARRAY ARRAYWITHOBJETS: Student1, Student2, Student3, Nil];
[Student SetValue: Array Forkey:@"Manyststudents"];
NSLog (@"%@", [Student ValueForKeypath:@"Manystudents.Number"]);
Impresso é uma matriz (200.300.400)