------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">ios培训</a>、期待与您交流! ----------
<pre name="code" class="cpp">iOS Foundation基础框架就是以Foundation.h头文件的库
#import <Foundation/Foundation.h>
Mac OS X和iOS都使用了Foundation基础框架。该框架中有很多日后开发常用的API,非常基础重要。以下就常用的类和结构做个介绍。
NSObjct
NSObject类,是ObjC类族中的根类。NSObject有一些高级特性支持,在灵活和高效开发中十分常用。
perform…方法和selector
selector是ObjC高级的语法特性,可看作C函数指针,或者Java反射API的Method类相关内容。看一下下面的代码,读者就应该能理解,首先我有个Book类:
#import <Foundation/Foundation.h>
@interface Book : NSObject {
}
-(void) printInformation;
@end
可以看到有个方法printInformation。一般调用该方法大致是这样:
Book *book=[[Book alloc] init];
[book printInformation];
如果使用selector和perform…方法可这样调用:
Book *book=[[Book alloc] init];
[book printInformation];
SEL method=@selector(printInformation);
id object=book;
[object performSelector:method];
这里,SEL是selector类型。方法可通过这种机制成为变量,传递到任意位置调用,可编写极为灵活和复用性高的代码。
这里调用的方法没有参数传递,是最简单的情况,下面演示一下带参数的,修改Book类的方法:
#import <Foundation/Foundation.h>
@interface Book : NSObject {
}
-(void) printInformation:(NSString *)bookName;
@end
带一个参数。那么上面的两种调用方法的代码将修改为:
Book *book=[[Book alloc] init];
[book printInformation:@"Objective-C Tutorial"];
SEL method=@selector(printInformation:);
id object=book;
[object performSelector:method withObject:@"Objective-C Tutorial"];
如果多个参数呢?比如:
-(void) printInformation:(NSString *)bookName bookPrice:(NSString *)price;
那么:
Book *book=[[Book alloc] init];
[book printInformation:@"Objective-C Tutorial" bookPrice:@"$17.00"];
SEL method=@selector(printInformation:bookPrice:);
id object=book;
[object performSelector:method withObject:@"Objective-C Tutorial" withObject:@"$17.00"];
再多的参数,直接这样调用就不行了。需要借助NSInvocation类。具体实现就不展开说了。
perform…方法调用还有一个方便的机制,就是延时调用。可以看作一次性的timer。比如:
Book *book=[[Book alloc] init];
[book printInformation:@"Objective-C Tutorial"];
SEL method=@selector(printInformation:);
id object=book;
[object performSelector:method withObject:@"Objective-C Tutorial" afterDelay:10];
NSLog(@"view did load ok.");
可以看到多了个参数,afterDelay,参数值单位是秒。结果:
2011-05-19 15:27:56.930 iOSSimpleDemo[6793:207] Objective-C Tutorial
2011-05-19 15:27:56.932 iOSSimpleDemo[6793:207] view did load ok.
2011-05-19 15:28:06.931 iOSSimpleDemo[6793:207] Objective-C Tutorial
从日志可知,带afterDelay参数的方法调用,将延时10秒钟再执行。而主线程并不阻塞,而是继续打印了后面的“view did load ok.”日志。这里的实现原理是,
调用afterDelay参数的方法后,将该方法调用存入队列,主线程在10秒后,再从队列中取得它并调用。
判断对象是否相等
这里涉及到两个方法:
isEqual
hash
前者,比如:
BOOL isEqual=[book isEqual:book];
NSLog(@"book is equals: %@",isEqual?@"yes":@"no");
和Java类似的,相等的对象,它们的hash值必须是相同的。这是因为,hash值将用于依赖hash值的集合元素定位,比如HashSet。hash值不同但相等的对象,
将导致在集合中,比如HashSet放入多个。另外,如果自行设置hash值(默认是内存值),不能使用可能变化的值,比如你有个类,User,该类有个属性,name,
如果这个name是可改的,就不要用该属性的hash值(字符串的hash值)作为User类的hash方法返回值。