您的位置:首页 > 移动开发 > Objective-C

Objective-c语言_KVC

2015-12-23 09:44 531 查看
打开Xcode->选择IOS->Application->Single View Application->然后按next

2.如果你创建了工程那快捷键(com-shift-N)->选择IOS->Application->Single View Application->然后按next

在工程项下个找到ViewController.m文件

ViewController.m

#import "ViewController.h"

#import "Student.h"

#import "Book.h"

@interface
ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super
viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

/*

设计模式--观察者模式

设计模式是用来解决某些特定问题

观察者模式

什么是观察者模式

当一个类需要发送消息给多个类的时候,就用观察者模式

什么时候是有观察者模式呢?

在工程中,一下类取观察A类,当‘A类’发生变化时,这些观察类就会收到消息,作出相应反应

观察者模式的作用?

一对多的发送消息;

如何在OC中实现观察者模式呢?

OC中观察者模式的设计基础“KVC/KVO”

KVC的由来在ios2.0之前,并没用属性来访问类中的实例变量,那时候开发人员是有‘键值编码’的方式

来访问类的实例变量,即‘KVC’的方式

什么是KVC (keh- Value Coding)键值编码

通过指定表示要访问的属性名字的字符串标识符,可以进行类的属性读取和设置

KVC提供了一种在运行时而非编译是动态访问对象属性与实例变量的方式。

*/

Student *student=[Student
new];

//赋值

[student setValue:@"Rick"
forKey:@"_name"];

[student setValue:@25
forKey:@"_age"];

[student setValue:@"GZ"
forKey:@"_address"];

NSLog(@"%@",[student
description]);

//访问

NSString *studentName=[student
valueForKey:@"_name"];//去掉下划线也能运行的

NSInteger studentAge=[student
valueForKey:@"_age"];

NSString *studentAddress=[student
valueForKey:@"_address"];

NSLog(@"studentName=%@ studentAge=%@ studentAddress=%@",studentName,studentAge,studentAddress);

//动态访问某些属性时,是有一些可以在运行时而不是编译时改变的值
的例子

student.p1=1;

student.p2=2;

student.p3=3;

int num=[student
getValueProoertyName:@"p1"];

NSLog(@"num=%d",num);

int num1=[student
getValueProoertyNewName:@"p2"];

NSLog(@"num1=%d",num1);

//键路径编码

Book *book=[Book
new];

//Book是student的成员变量

[student setValue:book
forKey:@"_book"];//forKeyPath可以不用forKey

//book对象赋给student的成员变量

[student setValue:@"Harry Potter"
forKeyPath:@"_book._bookName"];//访问student里面访问Book的成员变量

NSLog(@"bookName=%@",[book
description]);

NSString *bookName=[student
valueForKeyPath:@"_book._bookName"];

NSLog(@"bookName=%@",bookName);

/*

在student

@synthesize hobby;

封装变量

这样做就是会暴露实例的成员变量

*/

// [student setValue:@"play the guiter" forKey:@"_hobby"];

// NSLog(@"%@",[student valueForKey:@"_hoddy"]);//字典差不多意思是用key的名访问value

/*

在student

@synthesize hobby=ttt;

封装变量

这样做的原因之一就是不暴露实例的成员变量

*/

[student setValue:@"play the guiter"
forKey:@"ttt"];

NSLog(@"%@",[student
valueForKey:@"ttt"]);//字典差不多意思是用key的名访问value

}

- (void)didReceiveMemoryWarning {

[super
didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

=====================================================================

Student.h

#import <Foundation/Foundation.h>

#import "Book.h"

@interface Student :
NSObject

{

NSString *_name;

NSInteger _age;

Book *_book;

}

@property(nonatomic,strong)NSString *address;

@property(nonatomic)int p1;

@property(nonatomic)int p2;

@property(nonatomic)int p3;

-(int)getValueProoertyName:(NSString *)pName;

-(int)getValueProoertyNewName:(NSString *)pName;

@property(nonatomic,strong)NSString *hobby;

@end
==========================================================

Student.m

#import "Student.h"

@implementation Student

@synthesize hobby=ttt;//把hobby修改为ttt

-(NSString *)description

{

return [NSString
stringWithFormat:@"my name is %@ and age is %ld ,address =%@",_name,_age,_address];

}

-(int)getValueProoertyName:(NSString *)pName

{

if ([pName isEqualToString:@"p1"])

{

return self.p1;

}

else if ([pName
isEqualToString:@"p2"])

{

return self.p2;

}

else if([pName
isEqualToString:@"p3"])

{

return self.p3;

}

return 0;

}

-(int)getValueProoertyNewName:(NSString *)pName

{

NSNumber *pNumber=[self
valueForKey:pName];

return [pNumber
intValue];

}

@end

========================================================

Book.h

#import <Foundation/Foundation.h>

@interface Book : NSObject

{

NSString *_bookName;

}

@end
=========================================================

#import "Book.h"

@implementation Book

-(NSString *)description//他是在API他是类方法但现在用实例方法说明他是属性

{

return [NSString
stringWithFormat:@"bookName is %@",_bookName];

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: