——- android培训、ISO培训、期待与您交流! ———-
Foundation框架所有的类都可以在Xcode安装文档中找到。可以在Xcode的Organizer窗口选择Documentation选项卡,来查看这些文档。
Foundation框架是以另外一个框架CoreFoundation为基础创建的。CoreFoundation是用纯C语言写的,如果函数或变量的名称以CF开头,那么它们就属于CoreFoundation框架。
一些有用的数据结构
Cocoa提供了一些结构体(struct)。
范围
第一个结构体是NSRange:
typedef struct _NSRange
{
unsigned int location;
unsigned int length;
} NSRange;
这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组理的元素范围。Location字段存放该范围的起始位置,length字段则是该范围内所含元素的个数。在字符串”Objective-C is a cool language”中,单词cool可以用location为17,length为4的范围来表示。location还可以用NSNotFound这个值来表示没用范围。比如变量没有初始化。
创建新的NSRange有三种方式。第一种,直接给字段赋值:
NSRange range;
range.location = 17
range.length = 4;
第二种,应用C语言的组合结构赋值机制:
NSRange range ={ 17, 4 };
第三种,是使用Cocoa提供的快捷函数NSMakeRange():
NSRange range = NSMakeRange( 17, 4 );
使用NSMakeRange()的好处是可以在任何使用函数的地方使用它,例如在方法调用中将其作为参数进行传递。
[anObject flarbulateWithRange : NSMakeRange( 13, 15 )];
几何数据类型
用来处理几何图形的数据类型,它们的名称都带有CG前缀,如CGPoint和CGSize。这些类型是由Core Graohics框架提供的,用来进行2D渲染。Core Graphics是用C语言写的,因此可以在代码中使用C语言的数据类型。CGPoint表示的是笛卡尔平面中的一个坐标( x, y )。
struct CGPoint
{
float x;
float y;
};
CGSize用来储存长度和宽度:
struct CGSize
{
float width;
float height;
};
CoCoa提供了一个矩形数据类型,它由坐标和大小复合而成。
struct CGRect
{
CGPoint origin;
CGSize size;
};
Cocoa提供了创建这些数据类型的快捷函数:CGPoint()
、CGSizeMake()
和CGRectMake()
。
字符串
创建字符串
printf()
和NSLog()
之类的函数会接受格式字符串和一些参数来输出格式化的结果。NSString的stringWithFormat :
方法就是这样通过格式化字符串和参数来创建NSString的。
+ (id) stringWithForamt : (NSString *) format, ...;
可以按如下方式创建一个新的字符串:
NSString *height;
height = [NSString stringWithFormat : @"Your height is %d feet,%d inches", 5. 11];
得到的字符串是:”Your height is 5 feet,11 inches”
类方法
stringWithFormat :
的声明的最后的省略号 ”…“, 告诉编译器这个方法可以接受多个以逗号隔开的其他参数,就像printf()
和NSLog()
一样。
stringWithFormat :
的声明的起始字符是一个“+”, 这表明这个方法是一个类方法。类方法属于类对象(注意不是类的实例对象),类方法通常用于创建新的实例。这种用来创建相比对象的类方法通常称为工厂方法。
stringWithFormat :
就是一个工厂方法,它根据提供的参数创建新对象。
Objective-C生成一个类的时候,会创建一个代表该类的类对象。类对象包含指向超类、类名和类方法列表的指针,还包含一个long类型的数据,为新创建的实例对象指定大小(以字节为单位)。
类方法可以用来访问全局数据。AppKit中的NSColor类和UIKit中的UIColor类都拥有以各种颜色命名的类方法,比如redColor和blueColor。要用蓝色绘图,可以像下面这样编写代码:
NSColor *haveTheBlues = [NSColor blueColor];
或
UIColor *blueMan = [UIColor blueColor];
要创建的大部分方法都是实例方法,要用 “-” 作为前缀来进行声明。这些方法在指定的对象实例中起作用,比如获取一个Circle的颜色或者一个Tire的压强。如果某方法实现的是很通用的功能,那么可以用 “+” 作为前缀声明成类方法。
关于大小
NSString的length方法返回字符串中的字符个数:
- (NSUInteger) length;
可以这么使用:
NSUInteger length = [height length];
也可以在表达式中使用:
if ([height length] > 35)
{
NSLog (@"wow,you're really tall!");
}
字符串比较
NSString提供了几个用于比较字符串的功能:
isEqualToString : 用来比较接收方(receiver, 接受消息的对象) 和作为参数传递过来的字符串。isEqualToString : 返回一个BOOL值(YES或NO)来表示两个字符串的内容是否相同。
声明如下:
- (BOOL) isEqualToString: (NSString *) aString;
使用方法如下:
NSString *thing1 = @"hello 5";
NSString *thing2 = [NSString stringWithFormat: @"hello %d", 5];
if ([thing1 isEqualToString: thing2])
{
NSLog (@"They are the same!");
}
要比较两个字符串,可以使用compare: 方法,声明如下:
- (NSComparisonResult) compare: (NSString *) aString;
compare: 将接收对象和传递过来的字符串逐个进行比较,它返回一个NSComparisonResult(是一个enum型枚举)来显示比较结果。
enum
{
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
比较两个字符串是否相等时,应该使用isEqualToString: , 而不能仅仅比较字符串的指针值:
if ([thing1 isEqualToString: thing2])
{
NSLog (@"the strings are the same!");
}
不同于
if(thing1 == thing2)
{
NSLog (@"They are the same object!");
}
这是因为==
运算符值判断thing1和thing2的指针数值,而不是它们所指的对象。由于thing1和thing2是不同的字符串,所以第二种比较方法会认为它们是不同的。
因此,如果想检查两个对象(thing1和thing2)是否为同一事物,就应该使用运算符==
。如果是想查看是否相等(即这两个字符串是否内容相同),那么使用isEqualToString: 。
类似与C语言的qsort()
和bsearch()
,如果compare:
返回的结果是NSorderedAscending,那么左侧数值小于右侧数值,比如[@"aardvark" compare: @"zygote"]
将返回NSOrderedAscending。
同样的,[@”zoinks” compare: @”jinkies”]返回NSOrderedDescending。[@”fnord” compare: @”fnord”]返回NSOrderedSame。
不区分大小写的比较
compare:
进行的是区分大小写的比较。就是说,@”Bork”和@”bork”的比较是不会返回NSOrderedSame的。方法compare: optins:
则有更多的选择权。
- (NSComparionResult) compare: (NSString *) aString opting: (NSStringCompareOptions) mask;
options参数是一个掩位码。可以使用位或bitwise-OR运算符( | )来添加选项标记。常用选项如下:
NSCaseInsensitiveSearch: 不区分大小写字符
NSLiteralSearch: 进行完全比较,区分大小写字符
NSNumbericSearch: 比较字符串的字符个数,而不是字符串值。如果没有这个选项,100会排在99的前面。
//假如想比较字符串,需用忽略大小写并按字符个数进行排序:
if ([thing1 compare: thing2 option: NSCaseInsnsitiveSearch | NSNumbericSearch] == NSOrderedSame)
{
NSLog (@"They match!");
}
字符串内是否还包含其他字符串
有两个方法能帮忙判断:检查字符串是否一另一个字符串开头,判断字符串是否以另一个字符串结尾:
- (BOOL) hasPrefix: (NSString *) aString;
- (BOOL) hassuffix: (NSString *) aString;
使用方法:
NSString *fileName = @"draft-chapter.pages";
if ([fileName hasPrefix: @"draft"])
{
// this is a draft
}
if ([fileName hasSuffix: @".mov"])
{
// this is a movie
}
想知道字符串内是否包含其他字符串,使用rangeOfString:
。
- (NSRange) rangeOfString: (NSSreing *) aString;
将rangeOfString:
发送给一个NSString对象时,传递的参数是要查找的字符串。他返回一个NSRange结构体:
NSRange range = [fileName rangeOfString: @"chapter"];
返回的range.locarion为6,range,length为7。如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。
可变性
Cocoa提供一个NSString的子类,叫做NSMuableString,用来改变字符串。
可以使用类方法stringWithCapacity:
来创建一个新的NSMutableString:
+ (id) stringWithCapacity: (MSUInteger) capacity;
创建一个新的可变字符串:
NSMutableString *string = [NSMutableString stringWithCapacity: 42];
通过appendString: 或appendFormat: 来附加新字符串:
- (void) appendString: (NSString *) aString;
- (void) appendFormat: (NSString *) format, ...;
appendString: 接收参数aString, 然后将其复制到接收对象的末尾。appendFormat: 与stringWithFormat: 类似,但并没用创建新的字符串,而是将格式化的字符串附加在接收字符串的末尾。例如:
NSMutableString *string = [NSMutableString stringWithCapacity: 50];
[string appendString: @"Hello there"];
[string appending: @"human @d!", 39];
最后的结果是string被赋值”Hello there human 39!”
deleteCharactersInRange:
方法删除字符串中的字符。
- (void) deleteCharacTERsInRange: (NSRange) aRange;
NSMutableString是NSString的子类,任何使用NSString的地方都可以用NSMutableString替代。与实例方法一样,继承对类方法也同样适用。所以,NSString的类方法stringWithFormat: 也可以用来创建新的NSMutableString对象。
NSMutableString *string = [NSMutableString stringWithFormat: @"jo%dy", 2];
string的初始值是jo2y。