[obj-c]基础的东西
记录学习obj-c的一些基础的东西
====================================
obj-c方法前的符号含义。
?
减号 –
实例方法
???? 代表此方法是实例方法,必须先生成类实例,通过实例才能调用该方法。
?
加号 +?
类方法
??? 代表此方法是类的静态方法,可以直接调用,而不用生成类实例。
====================================
KVC?
?
概述?KVC是KeyValue Coding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。?
-valueForKey:
-setValue: forKey:
?
path
-valueForKeyPath:
-setValue: forKeyPath:
{把xx设置到马力: 车下的引擎属性,引擎属性下的马力
?[car setValue:@"xxxxx" forKeyPath:@"engine.power"]
}
?
整体操作(数组类)
KVC有一个很棒的一点是,如果NSArray 请求一个键值,它实际上会查询数组中的每一对象来查找这个键值。
ex:
tires<-数组
?
NSArray *pressures = [car valueForKeyPath: @"tires.xxxx"]
?
此时会把所有tires数组内的对象的xxxx属性都查询出来以NSArray的形式。
?
?
流畅的计算(通过使用path与@来实现快速计算)
在valueForPath下使用path与@来实现快速计算 cars是个数组
ex:计算一共用多少车
count = [xx valueForPath:@"cars.@count"]
@sum?
@min
@max
@avg
?
等目前我还不知道其他=-=
ex2:车队中形式公里最长的公里数 cars是个NSArray max会存放车队 cars中行驶公里最长的公里数
max= [xx valurForPath:@"cars.@max.gongli"]
!注意:编译器无法判断他是不是错误键路径。\
?
@distinctUnionOfObjects 在左边的属性数组对应右边属性中去重取出,以NSArray形式
[xx valueForKeyPath:@"cars.@distinctUnionOfObjects.make"]
去重取出make
distinct表示去重 union表示集合
?
处理setValue:forKey: ?value为nil的问题
重写-(void) setNillValueForKey: (NSString *)key?
{
if(key isEqualToString: @"xxxx"){
XXXX=一个值为nil时此属性应该的值
}else{
[super setNilValueForKey:key];
}
}
?
处理未定义的键
添加一个NSMutableDictionary字典来保存未定义的键
重写
-(void) setValue:(id) value forUndefinedKey:(NSString *)key{
if(stuff==nil){
stuff=[[NSMutableDictionary alloc] init]
}
[stuff setValue:value for:key]
}
重写
-(id) valueForUndefinedKey:(NSString *)key{
id value = [stuff valueForkey:key];
return(value)
}
?
?
<null>,(null),nil
<null>
表示[NSNull null]
(null)
是一个真实的nil
nil
obj-c中的空值
NSDictionary ?setValue:forkey:如果设置nil的话 会把对应的键从字典中删除。
?
NSPredicate
类似过滤器
[NSPredicate?predicateWithFormat: @"name=='herbie'"]
返回一个?NSPredicate ?类型对象 此对象表明 过滤:只保留name属性等于herbie。
name属性那个位置可以放置keyPath 如对car使用过滤器时 engine.horsepower>xxx
?
predicateWithFormat后跟一个@"keypath 运算符 value"
且@" (第一个过滤条件) AND (第二个过滤条件)"
AND 还可以为 OR, NOT, &&, ||, !,可以不分大小 不过还是大写好点
不等号不仅适用于数值 也适用于字符。比如<N 则过滤剩下A~M的。
?
数组运算符
引擎马力在50到200之间的。
BETWEEN?
@“engine.horsepower BETWEEN {50,200}”
IN
@“name IN{'abc','poolo'}”
?
字符串运算符
BEGINSWITH 以什么为开头
ENDSWITCH 以什么为结尾
CONTAINS 是否包含
?
LIKE运算符
name LIKE ‘*er*’ ?//包含er的 *表示前后任意
name LIKE '???er*'//er前面只能有3位后面任意
LIKE[cd] 用于忽略大小写
MATCHES 万恶的正则表达式
?