记录学习obj-c的一些基础的东西
====================================
import ”xx"与import <> 区别
<>表示程序将会首先且只会去你的系统类库目录查找你所想引入的类或者包;
""表示程序会首先从你的当前目录查找你所想引入的类或者包,如果没有找到,将去系统类库目录找.
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:@"[email protected]"]
!注意:编译器无法判断他是不是错误键路径。\
@distinctUnionOfObjects 在左边的属性数组对应右边属性中去重取出,以NSArray形式
[xx valueForKeyPath:@"[email protected]"]
去重取出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 万恶的正则表达式
====================
一个_
_XX 表示是全局变量
两个_
__XX 表示是局域变量
====================
当属性为对象指针时 必须要使用(weak/strong) 修饰
strong 表示 长期持有
keep tihs in the head until i don't point to it anymore
weak 表示 如果没有使用 则释放
keep this as long as someone else points to it strongly
====================
self super in .h .m
.h
self means my plementation
super means my superclass's implements
.m
self means tihs class's class methods
super this class 's superclass's class methods
故 self与super只能调用class method [方法前面带+号的]
====================
参数不确定的时候用,号
如stringWithFormat @"%@",x
====================
id
oc 中 id可以接受任何对象,并且 id可以执行import到此类的方法。
id c=[[NSString alloc] init]
//此时c可以执行NSString的方法。
isKingOfClass: 是否是这种类别的[包含继承自这个类] 既所有类都是isKindOfClass:NSobject 的class
isMemberOfClass: 是否是这种类的[只考虑自己 不考虑继承]既父类是不是不考虑
[obj isKindOfClass:[NSString class]]
respondsToSelector: 回复这个对象是否有这种方法。(方法选择器见下一模块)
[obj respondsToSelectore:@selector(shoot)]
====================
SEL
方法选择器[stanford课程第第三课]
SEL XXX=@selector(shoot)
[obj performSelector:obj的xx方法] //obj执行xx方法
//button 是UIButton对象
[button addTarget:self action:@selector(xx方法)]//绑定这个Button的执行目标为self,并将这个button按钮action绑定到xx方法。