首页 > 代码库 > Objective-C之成魔之路【15-Foundation框架】
Objective-C之成魔之路【15-Foundation框架】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。
如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源码下载:点我传送
AppKit和UIKit框架都是与窗口 、 按钮、 列表等相关的类。
Foundation是Mac OS X和iOS应用程序开发的基础框架,
快速概要:
光标放在需要搜索的类、方法或变量上,按住Option键,同时单击鼠标,你会看到所选择内容的快速概要。
在面板的右上角注意到有两个图标:第一个是一本书,第二个是一个字符h。
单击那个书的图标,Xcode会查找选择的类、协议、定义或者方法的相关文档。
单击字符h的图标,将会显示包含选择项目定义的头文件。
MAC OS X在线参考库,地址是点击打开链接。
#import <Foundation/Foundation.h>
实际上,因为Foundation.h文件导入Foundation所有的头文件,所以不必担心是否导入正确的头文件。
但使用这条语句会明显增加程序的编译时间。
所以,一般import用到的头文件。不要用太大的import。
基本数据类型:
int、 char、 float和double都不是类,
不具有方法、 成员变量和属性, 以及面向对象的特征。
为了实现“一切都是对象” 的承诺,
因此在Foundation框架中使用NSNumber类来封装这些数字类型。
这样数字就具有了面向对象的基本特征了。
也就是说:如果需要存储基本数据类型(包括char数据类型),可以使用NSNumber类,
它会依据这些数据的类型创建对象。
对于每种基本数据类型,类方法都能为它创建一个NSNumber对象,并设置为指定的值。
这些方法以numberWith开头,紧接着数据的类型,如:numberWithLong:
NSNumber *intNumber= [NSNumber numberWithInteger:80]; NSNumber *floatNumber = [NSNumber numberWithFloat: 80.00]; int myint = [intNumber intValue]; float myfloat = [floatNumber floatValue];
注意,方法numberWithInt:和numberWithInteger:使用有些差别,遵循以下一些规则:
1)如果使用numberWithInt:方法创建一个整型数,需要使用intValue获取它的值,使用%i作为格式化字符串显示它的值。
2)如果使用numberWithInteger:方法创建一个整型数,需要使用integerValue获取它的值,也可以转换成long显示或使用stringWithFormat:将它格式化为字符串。使用%li作为格式化字符串。
可以转化成为基本数据类型比较, 当然可以使用 NSNumber的方法比较,
isEqualToNumber: 和compare: 。
if ([intNumber isEqualToNumber: floatNumber] == YES) { NSLog(@"相等"); } else { NSLog(@"不相等"); } if ([intNumber compare: myNumber] == NSOrderedAscending) { NSLog(@"第一个数小于第二个数"); }NSOrderedAscending是枚举类型NSComparisonResult的其中成员, 代表第一个数小于第二个数,
NSSTring的类,用于处理字符串对象。然而C样式的字符串由char字符组成,NSString对象由unichar字符组成。
要使用Objective-C语言创建一个常量字符串对象,需要在字符串开头放置一个@字符。
创建字符串对象时,会创建一个内容不可更改的对象,这称为不可变对象。
需要制定一个范围确定子字符串,使用特殊的数据类型NSRange类创建对象。
实际上,它是结构的typedef定义,包含location和length两个成员。
如果没有找到这个字符串,则返回范围的location成员被设置为NSNotFound。
stringByAppendingString:实现了字符串的拼接,这个方法会产生下一新的对象;
isEqualToString:比较两个字符串是否相等;
compare: 比较两个字符串大小;
substringToIndex:可以获得字符串的前x个字符串;
substringFromIndex:可以截取x索引位置到尾部字符串;
rangeOfString:字符串查找;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str1 = @"aBcDeFgHiJk"; NSString *str2 = @"12345"; NSString *res; NSComparisonResult compareResult; NSRange subRange; //字符个数 NSLog(@"字符串str1长度: %i",[str1 length]); //拷贝字符串到res res = [NSString stringWithString: str1]; NSLog(@"拷贝: %@", res); //拷贝字符串到str1尾部 str2 = [str1 stringByAppendingString: str2]; NSLog(@"连接字符串: %@", str2); //测试字符串相等 if ([str1 isEqualToString: res] == YES) { NSLog(@"str1 == res"); } else { NSLog(@"str1 != res"); } //测试字符串 < > == compareResult = [str1 compare: str2]; if (compareResult == NSOrderedAscending) { NSLog(@ "str1 < str2"); } else if (compareResult == NSOrderedSame) { NSLog(@ "str1 == str2"); } else { NSLog(@ "str1 > str2"); } res = [str1 uppercaseString]; NSLog(@"大写字符串:%@", res); res = [str1 lowercaseString]; NSLog(@"小写字符串:%@", res); NSLog(@"原始字符串: %@", str1); //获得前三个数 res = [str1 substringToIndex: 3]; NSLog(@"字符串str1的前三个字符: %@",res); res = [str1 substringFromIndex: 4]; NSLog(@"截取字符串,从第索引4到尾部: %@",res); res = [[str1 substringFromIndex: 3] substringToIndex: 2]; NSLog(@"截取字符串,从第索引3到5: %@",res); //字符串查找 subRange = [str2 rangeOfString: @"34"]; if (subRange.location == NSNotFound) { NSLog(@"字符串没有找到"); } else { NSLog (@"找到的字符串索引 %i 长度是 %i", subRange.location, subRange.length); } [pool drain]; return 0; }
NSMutableString类可以用来创建可以更改字符的字符串对象。
注意,如果替换字符串中还包括搜索字符串(如:使用字符串“ax”替换字符串“a”),
那么将会陷入无限循环。
其实,这个是和它的实现原理有关系,一般这种替换使用的方法使用了递归调用。
insertString: 插入字符串, 不会创建新的对象;
appendString: 追加字符串, 不会创建新的对象;
deleteCharactersInRange: 在一个范围内删除字符串, 不会创建新的对象;
replaceCharactersInRange: withString: 替换字符串, 不会创建新的对象;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str1 = @"Objective C"; NSString *search,*replace; NSMutableString *mstr; NSRange substr; //从不可变的字符创建可变字符串对象 mstr = [NSMutableString stringWithString: str1]; NSLog(@" %@", mstr); //插入字符串 [mstr insertString: @ " Java" atIndex: 9]; NSLog(@" %@", mstr); //具有连接效果的插入字符串 [mstr insertString: @ " and C++"atIndex: [mstr length]]; NSLog(@" %@", mstr); //字符串连接方法 [mstr appendString: @ " and C"]; NSLog(@" %@", mstr); //使用NSRange删除字符串 [mstr deleteCharactersInRange:NSMakeRange(16, 13)]; NSLog(@" %@", mstr); //查找字符串位置 substr = [mstr rangeOfString: @ "string B and"]; if (substr.location != NSNotFound) { [mstr deleteCharactersInRange: substr]; NSLog(@" %@", mstr); } //直接设置可变字符串 [mstr setString: @ "This is string A "]; NSLog(@" %@", mstr); [mstr replaceCharactersInRange: NSMakeRange(8, 8) withString: @ "a mutable string "]; NSLog(@" %@", mstr); //查找和替换 search = @"This is "; replace = @"An example of "; substr = [mstr rangeOfString:search]; if (substr.location != NSNotFound) { [mstr replaceCharactersInRange:substr withString: replace]; NSLog(@" %@", mstr); } //查找和替换所有的情况 search = @"a"; replace = @"X"; substr = [mstr rangeOfString: search]; while (substr.location != NSNotFound) { [mstr replaceCharactersInRange:substr withString: replace]; substr = [mstr rangeOfString: search]; } NSLog(@" %@", mstr); [pool drain]; return 0; }
数组对象:是Foundation数组是有序的对象集合。
数组有两种:
NSArray不可变数组类和NSMutableArray可变数组类。
注意,需要标记参数数组的结束,将这个数组的最后一个值定为nil,它实际上并不会存储在数组中。
数组中的元素是由它们的索引数确定的。与NSString对象类似,索引从0开始。
可以通过NSLog格式化字符串%@显示整个数组。
NSArray有很多方法, 下面是总结常用的方法:
count: 返回当前数组的长度;
objectAtIndex: 按照索引返回数组中的元素;
containsObject: 是否包含某一元素;
arrayWithObjects: 类级构造方法;
initWithObjects: 实例构造方法;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSArray *weeksNames = [NSArray arrayWithObjects: @"星期一",@"星期二",@"星期三",@"星期四" ,@"星期五",@"星期六",@"星期日",nil]; NSLog(@"星期名字"); NSLog(@"==== ===="); int i; for (i=0; i < [weeksNames count];i++) { NSLog(@"%2i %@ ", i+1, [weeksNames objectAtIndex: i]); } [pool drain]; return 0; }
insertObject: 在数组的添加一个元素;
atIndex: 按照索引插入一个元素;
removeObjectAtIndex: 移除特定索引的元素;
removeObject: 移除特定元素;
initWithCapacity: 实例构造方法;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSMutableArray *weeksNames = [[NSMutableArray alloc] initWithCapacity: 3]; [weeksNames addObject: @"星期一"]; [weeksNames addObject: @"星期二"]; [weeksNames addObject: @"星期三"]; [weeksNames addObject: @"星期四"]; [weeksNames addObject: @"星期五"]; [weeksNames addObject: @"星期六"]; [weeksNames addObject: @"星期日"]; NSLog(@"星期名字"); NSLog(@"==== ===="); int i; for (i=0; i < [weeksNames count];i++) NSLog(@"%2i %@ ", i+1, [weeksNames objectAtIndex: i]); [weeksNames release]; return 0; }
NSValue:
数组这样的Foundation集合只能存储对象,不能存储像int这样的基本数据类型。
NSValue类正好可以将结构转化为对象,并且把它存储在集合中。
这种将结构化转为对象的方式,简称为包装(wrapping),
逆向的处理是从对象中解出基本类型,简称展开(unwrapping)。
词典可以使固定的,也可以是可变的。
可变词典中的记录可以动态添加和删除。
和数组对象不一样,词典对象是无序的。
count: 字典集合的长度;
objectForKey: 通过键获得值对象;
allKeys: 返回所有键集合;
arrayWithObjects: 类级构造方法;
initWithObjects: 实例构造方法;
initWithObjects:forKeys: 实例构造方法;
initWithObjectsAndKeys: 实例构造方法;
initWithContentsOfFile: 从属性文件中创建对象;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSArray * keys = [@"one two three four five" componentsSeparatedByString:@" "]; NSArray * values = [@"alpha bravo charlie delta echo" componentsSeparatedByString:@" "]; NSDictionary * dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys]; NSLog(@"%@", [dict description]); [dict release]; [pool drain]; return 0; }
串按照空格分割返回NSArray对象, 同理获得values对象,
然后使用 NSDictionary * dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys] 语句
NSMutableDictionary有很多方法, 下面是总结常用的方法:
setObject: forKey: 通过键和值;
removeObjectForKey: 按照键移除值;
writeToFile: atomically: 把对象写入到文件中;
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSMutableDictionary *mutable = [[NSMutableDictionary alloc] init]; // add objects [mutable setObject: @"Tom" forKey: @"tom@jones.com"]; [mutable setObject: @"Bob" forKey: @"bob@dole.com" ]; NSLog(@"%@", [mutable description]); [mutable release]; [pool drain]; return 0; }
NSMutableDictionary对象mutable。
集合对象:
set是一组单值对象集合,它可以是变的或不可以变的。
操作包括:搜索、添加、删除集合中的成员(仅用于可变集合),比较两个集合,计算两个集合的交集和并集等。
这些集合对象包括:NSSet、NSMutableSet、NSIndexSet和NSCountedSet等。
注意,NSIndexSet没有可变版本。
Objective-C之成魔之路【15-Foundation框架】