KVC之-(id)be365体育投注valueForKey:(NSString *)key的贯彻原理与认证

By admin in be365体育投注 on 2019年2月3日
测试代码:
    Person *p = [[Person alloc] init];
    p.name = @"小明";
    Person *p1 = [[Person alloc] init];
    [p1 setValue:@"小明" forKey:@"name"];
    Person *p2 = [[Person alloc] init];
    [p2 setValue:@"小花" forKey:@"name"];
    Person *p3 = [[Person alloc] init];
    [p3 setValue:@"happy" forKey:@"name"];

    NSArray *set = [[NSArray alloc] initWithObjects:p1,p2,p3, nil];
    NSArray *names =  [set valueForKey:@"name"];
    NSLog(@"%@",[names class]);
    NSLog(@"%@",names);

出口结果:

2015-08-16 00:33:21.741 company[1670:108148] -[Person isName]----------小明
2015-08-16 00:33:21.741 company[1670:108148] -[Person isName]----------小花
2015-08-16 00:33:21.741 company[1670:108148] -[Person isName]----------happy
2015-08-16 00:33:21.741 company[1670:108148] __NSArrayI
2015-08-16 00:33:21.741 company[1670:108148] (
    "\U5c0f\U660e",
    "\U5c0f\U82b1",
    happy
)

这里的names 类为一个可见响应NSArray享有办法的的代理对象


4.否则(1,2,3都尚未知足[尚无简单的getter方法,没有平稳Set的拜访方法也从没数组的拜会方法]),查找接收者对象的类中找寻上面三个方法的结合,他们名字匹配格局为-countOf<Key>,-enumeratorOf<Key>,
and -memberOf<Key>:
(对应定义在NSSet类中一个民用方法).如果上边多个艺术都找到了,组合使用-countOf<Key>,
-enumeratorOf<Key>,
-memberOf<Key>:这八个办法,给原本对象发送-valueForKey:信息,把重返结果放入一个可以响应NSSet的享有办法的代理对象中,然后再次来到这一个代理对象

be365体育投注 1

验证

团体成员术业专攻,各有所长:主管鲁朋远说“平台的原则性是(城市实体音信寻找服务平台)为的就是以VR全景为基数,解决用户在外卖平台遭受的黑作坊,在团购平台遭遇公司有失公平的对待,在房产平台蒙受的假新闻等等
,致力于解决已知网络用户在网络蒙受的痛点”

测试代码:
    Person *p1 = [[Person alloc] init];
    [p1 setValue:@"小明" forKey:@"name"];
    Person *p2 = [[Person alloc] init];
    [p2 setValue:@"小花" forKey:@"name"];
    Person *p3 = [[Person alloc] init];
    [p3 setValue:@"happy" forKey:@"name"];


    NSSet *set = [[NSSet alloc] initWithObjects:p1,p2,p3, nil];
    NSSet *names =  [set valueForKey:@"name"];
    NSLog(@"%@",[names class]);
    NSLog(@"%@",names);

出口结果:

2015-08-16 00:29:50.879 company[1646:106351] -[Person isName]----------happy
2015-08-16 00:29:50.879 company[1646:106351] -[Person isName]----------小花
2015-08-16 00:29:50.879 company[1646:106351] -[Person isName]----------小明
2015-08-16 00:29:50.879 company[1646:106351] __NSSetI
2015-08-16 00:29:50.879 company[1646:106351] {(
    happy,
    "\U5c0f\U660e",
    "\U5c0f\U82b1"
)}

这里的names 类为一个可见响应NSSet拥有办法的的代理对象


5.否则(1,2,3,4都未曾满足[未曾不难的访问器方法也从未集合的访问器方法]),如若接受器类的
+accessInstanceVariablesDirectly 方法再次回到YES,根据匹配形式
_<key>, _is<Key>, <key>, or is<Key>
去匹配实例变量名称,借使有一个实例变量找到了,就回来这一个实例变量的值,假如结果类型是一个对象的品类的指针就简单重返,如若回去结果类型是可以透过NSNumber更换协助的原始类型,先把转换为NSNumber下一场在回到,否则就变换为一个NSValue目的再次回到.

Person类中,分别接纳上边address举行测试

@interface Person : NSObject
{
//    NSString *address;
//    NSString *_address;
//    NSString *isAddress;
     NSString *_isAddress;

}

测试代码

    Person *p = [[Person alloc] init];
    [p setValue:@"金燕龙大厦" forKey:@"address"];
    NSString *address = [p valueForKey:@"address"];
    NSLog(@"%@",address);

输出结果均为

2015-08-16 00:41:16.387 company[1776:113187] 金燕龙大厦

6.否则(1,2,3,4,5都没有知足[不曾不难的访问器方法,没有集合访问方法,没有实例变量]),那么将会实施-valueForUndefinedKey:主意,默许发生一个NSUndefinedKeyException的非常,可是你可以重写该方法.

     NSString *工具 = [p valueForKey:@"工具"];
     NSLog(@"工具=%@",工具);

运行结果: 发生一个NSUnknownKeyException的老大

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Person 0x7fb2b2727b50> valueForUndefinedKey:]: this class is not key value coding-compliant for the key 工具.'

在Person.m文件中重写-valueForUndefinedKey: 方法

- (id)valueForUndefinedKey:(NSString *)key
{
    NSLog(@"%s",__func__);
    NSLog(@"key == %@",key);
    return @"黄瓜";
}

再次运行程序输出结果为:

2015-08-16 00:53:01.568 company[1841:119255] -[Person valueForUndefinedKey:]
2015-08-16 00:53:01.568 company[1841:119255] key == 工具
2015-08-16 00:53:01.568 company[1841:119255] 工具=黄瓜

be365体育投注 2

其一法子的默许完毕如下:


1.查找读访问器(getter)方法中与key相匹配的点子,匹配情势为-get<Key>,
-<key>-is<Key>,依照那样的次第如若找到一个方法,就执行它.如果重临结果类型是一个目标的项目标指针就差不离重临,要是回到结果类型是足以透过NSNumber改换协理的原始类型,先把转换为NSNumber下一场在回到,否则就更换为一个NSValue目的再次来到.


2.否则(简单的getter办法没有找到),那么就招来接受者的类中与
-countOf<Key> and -indexIn<Key>OfObject: and
-objectIn<Key>AtIndex: (NSSet类中定义的民用方法) and also
-<key>AtIndexes: (对应与 -[NSOrderedSet objectsAtIndexes:]be365体育投注,).
若是找到了-countOf<Key> , -indexIn<Key>OfObject: 以及那多少个
-objectIn<Key>AtIndex:, -<key>AtIndexes: 方法中一个,那么将结合使用
-countOf<Key>, -indexIn<Key>OfObject:, -objectIn<Key>AtIndex:,
and -<key>AtIndexes:
获取集合中的原始对象,然后给原本对象发送-valueForKey:音信,把结果存放入一个可见相应NSOrderedSet负有办法的聚集代理对象中,重回这一个代理对象.假使接收者类中贯彻了
-get<Key>:range: 当为取得最佳质量则动用该格局


3.再不(1和2都尚未满意),那么就接收者类中搜寻名字与-countOf<Key> and
-objectIn<Key>AtIndex: (定义在 NSArray 类中的私有方法) and
-<key>AtIndexes: (对应与 -[NSArray objectsAtIndexes:]).
假如找到了-countOf<Key>方法 和 -objectIn<Key>AtIndex: (定义在
NSArray 类中的私有方法) 与 -<key>AtIndexes: 中的其中一个,那么,通过
-countOf<Key>, -objectIn<Key>AtIndex:, and -<key>AtIndexes:
给原本对象发送
-valueForKey:信息,把重回结果放入一个可见响应NSArray享有办法的代理对象中,然后回到该代理对象.假诺接收器的类对象落成,一个名字与-get<Key>:range:.匹配可选方法,那么为了最好质量讲使用该方法.


4.否则(1,2,3都尚未满意[并未简单的getter方法,没有平稳Set的拜会方法也不曾数组的拜会方法]),查找接收者对象的类中追寻上面多个点子的结缘,他们名字匹配格局为-countOf<Key>,-enumeratorOf<Key>,
and -memberOf<Key>:
(对应定义在NSSet类中一个私有方法).要是下边多个方法都找到了,组合使用-countOf<Key>,
-enumeratorOf<Key>,
-memberOf<Key>:那多个章程,给原本对象发送-valueForKey:音讯,把重临结果放入一个可见响应NSSet的有所办法的代理对象中,然后回来那几个代理对象


5.否则(1,2,3,4都没有满意[未曾简单的访问器方法也不曾集合的访问器方法]),若是接受器类的
+accessInstanceVariablesDirectly 方法重回YES,按照匹配情势
_<key>, _is<Key>, <key>, or is<Key>
去匹配实例变量名称,借使有一个实例变量找到了,就回到这几个实例变量的值,倘若结果类型是一个目的的品类的指针就简单再次来到,假若回到结果类型是可以通过NSNumber转移支持的原始类型,先把转换为NSNumber接下来在回去,否则就转换为一个NSValue对象再次来到.


6.否则(1,2,3,4,5都没有满意[平素不简单的访问器方法,没有集合访问方法,没有实例变量]),那么将会举办-valueForUndefinedKey:主意,默许暴发一个NSUndefinedKeyException的格外,可是你可以重写该方法.


be365体育投注 3

Person.m

@implementation Person

- (int) age
{
    NSLog(@"%s------%d",__func__,_age);
    return _age;
}


- (NSString *) name
{
    NSLog(@"%s----------%@",__func__,_name);
    return _name;
}

@end

据悉,团队近期正积极谋求精灵轮融资,将根本用于产品优化、推广及品牌公关,现面对全国找同盟伙伴。

Person.h

typedef struct {
    int day;
    int month;
    int year;
} Date;

@interface Person : NSObject
{
    NSString *_name;
    int _age;
    Date *birthday;
//    NSString *address;
//    NSString *_address;
//    NSString *isAddress;
     NSString *_isAddress;

}

@property (nonatomic, copy) NSString *name;

@property (nonatomic,assign) int age;


@end

be365体育投注 4

验证

1.查找读访问器(getter)方法中与key相匹配的措施,匹配形式为-get<Key>,
-<key>, or -is<Key>,根据那样的相继若是找到一个主意,就进行它.
修改name的getter方法:

- (NSString *) getName
{
    NSLog(@"%s----------%@",__func__,_name);
    return _name;
}

输出结果为:

2015-08-15 23:53:16.771 company[1253:77763] -[Person getName]----------小明

再一次修改name的getter方法::

- (NSString *) name
{
    NSLog(@"%s----------%@",__func__,_name);
    return _name;
}

输出结果

2015-08-15 23:54:36.060 company[1275:78595] -[Person name]----------小明

双重修改name的getter方法:

- (NSString *) isName
{
    NSLog(@"%s----------%@",__func__,_name);
    return _name;
}

出口结果,为空,也就是说根本未曾举行isName方法
修改name属性的扬言为

@property (nonatomic, copy,getter=isName) NSString *name;

出口结果为

2015-08-15 23:58:59.271 company[1387:81935] -[Person isName]----------小明

2.万一遍去结果类型是一个对象的品种的指针就不难重返,倘使回去结果类型是足以经过NSNumber转移协助的原始类型,先把转换为NSNumber接下来在回去,否则就转换为一个NSValue对象返回.

测试代码

    p.name = @"小明";
    NSString *name = [p valueForKey:@"name"];
    NSLog(@"%@",[name class]);
    NSLog(@"%@",name);

    p.age = 10;
    NSNumber *age = [p valueForKey:@"age"];
    NSLog(@"%@",[age class]);
    NSLog(@"%@",age);

    p.birthday = (Date){1990,5,1};
    NSValue *birthday = [p valueForKey:@"birthday"];
    NSLog(@"%@",[birthday class]);
    NSLog(@"%@",birthday);

出口结果

2015-08-16 00:03:03.420 company[1440:84446] -[Person isName]----------小明
2015-08-16 00:03:03.421 company[1440:84446] __NSCFConstantString
2015-08-16 00:03:03.421 company[1440:84446] 小明
2015-08-16 00:03:03.421 company[1440:84446] -[Person age]------10
2015-08-16 00:03:03.421 company[1440:84446] __NSCFNumber
2015-08-16 00:03:03.421 company[1440:84446] 10
2015-08-16 00:03:03.421 company[1440:84446] NSConcreteValue
2015-08-16 00:03:03.421 company[1440:84446] <c6070000 05000000 01000000>

3.否则(简单的getter艺术没有找到),那么就招来接受者的类中与
-countOf<Key> and -indexIn<Key>OfObject: and
-objectIn<Key>AtIndex: (NSSet类中定义的村办方法) and also
-<key>AtIndexes: (对应与 -[NSOrderedSet objectsAtIndexes:]).
如若找到了-countOf<Key> , -indexIn<Key>OfObject: 以及那五个
-objectIn<Key>AtIndex:, -<key>AtIndexes: 方法中一个,那么将组成使用
-countOf<Key>, -indexIn<Key>OfObject:, -objectIn<Key>AtIndex:,
and -<key>AtIndexes:
获取集合中的原始对象,然后给原本对象发送-valueForKey:音讯,把结果存放入一个可见相应NSOrderedSet拥有办法的聚集代理对象中,再次来到那一个代理对象.如若接收者类中贯彻了
-get<Key>:range: 当为取得最佳品质则应用该方法

此地我使用系统自带的类进行认证

分别于行业服务于定制旅行社,全景智慧城市愈来愈多的将眼光转向组团旅行社,以三维可互相的不二法门为其提供行前预览、查阅和互相等效用。

测试代码:
    Person *p = [[Person alloc] init];
    p.name = @"小明";
    Person *p1 = [[Person alloc] init];
    [p1 setValue:@"小明" forKey:@"name"];
    Person *p2 = [[Person alloc] init];
    [p2 setValue:@"小花" forKey:@"name"];
    Person *p3 = [[Person alloc] init];
    [p3 setValue:@"happy" forKey:@"name"];

     NSOrderedSet *set = [[NSOrderedSet alloc] initWithObjects:p1,p2,p3, nil];
    NSOrderedSet *names =  [set valueForKey:@"name"];
    NSLog(@"%@",[names class]);
    NSLog(@"%@",names);

输出结果:

2015-08-16 00:35:39.134 company[1687:109689] -[Person isName]----------小明
2015-08-16 00:35:39.134 company[1687:109689] -[Person isName]----------小花
2015-08-16 00:35:39.134 company[1687:109689] -[Person isName]----------happy
2015-08-16 00:35:39.134 company[1687:109689] __NSOrderedSetI
2015-08-16 00:35:39.134 company[1687:109689] {(
    "\U5c0f\U660e",
    "\U5c0f\U82b1",
    happy
)}

这里的names
类为一个可见响应NSOrderedSet抱有办法的的代理对象,请留心那里所说的代理对象,与代理设计模式不是同一个概念,
那里代理就一定于中介,比如您想租某个房东租房子,但是你找不到那么些房东,只可以通过房产中介,传递新闻给房主,那个中介
就足以领略为代理对象


4.否则(1,2,3都未曾满意[未曾不难的getter方法,没有平稳Set的造访方法也不曾数组的走访方法]),查找接收者对象的类中寻找下边多个艺术的重组,他们名字匹配情势为-countOf<Key>,-enumeratorOf<Key>,
and -memberOf<Key>:
(对应定义在NSSet类中一个私房方法).假若上面多少个主意都找到了,组合使用-countOf<Key>,
-enumeratorOf<Key>,
-memberOf<Key>:那多个方法,给本来对象发送-valueForKey:音信,把重回结果放入一个可以响应NSSet的拥有办法的代理对象中,然后回到这些代理对象

全景智慧城市阳台的人性化之处更反映在,不仅对于智能手机用户提供“三维+全景”输出,对于非智能手机也提供二维输出,向其提供景点图片和文字版资料。

KVC之-(id)valueForKey:(NSString *)key的落成原理与认证

针对这一个题目,全景达人:作者近年来领悟到的全景智慧城市APP的一个分类的作用,一个面向旅行社的VR行程管理营销系统,支持旅行社将二维旅行路线转为三维+全景格局,并能够享用至微信、搜狐等社交平台。

2.-(id)valueForKey:(NSString *)key的贯彻原理与认证;

#######功用:使用一个字符串类型的品质标示符,获取一个属性的值,帮助一般对象和NSSet,NSArray会面对象,借使是NSArray目的就则赶回不可变数组,假如是NSet就回去不可变NSSet.

旅行社可经过输入景点名称、经纬度及地图等二种差异形式导入旅行的路途,全景智慧城市阳台将会自动以“三维+全景”的款式出口每一天的里程。旅行社将行程导出后,可由此微信搜狐分享给乘客,游客可通过用手机连接VR眼镜或是直接裸眼VR来赏析行程中的景点。而全景智慧城市阳台输出的路途显示又可分为地面和空中两部分:地面部分首要包含景况图片,近日已覆盖满世界限量景点;空中部分则是因此建模完成1:1还原山地地貌,游客可720度环绕观望,落成一体目标地预览。VR智能云旅游平台还提供了弹幕功效,方便用户立刻举办交换与评价。

开拓者鲁朋远告诉作者,团队以热那亚本土百家旅行社为模本进行了调研,其中有45%的旅行社表示有意向利用全景智慧城市阳台,有19%则直接签订了协和,其它团队也与年出入境人数超10万的巨型旅行社完毕了深度合营。团队主要的盈利方式为按系统账户数额收取年使用费。关于下一阶段发展设计,团队安顿先从南宁做起,情势成熟后在壮大到全国,争取在今年底扩大到一万家旅行社。

乘势生活档次的频频增强,人们的饱满文化必要也愈来愈高。工作之余,踏上一条舒适惬意的远足路线来充实自己,已经改成多数人的选项。可是旅行社所提供的文字版景点介绍,不可以让读者有靠近之感,成交转化率较低。

be365体育投注 5

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 mobile.365-838.com 版权所有