------- android培训、java培训、IOS培训期待与您交流! ----------
Foundation框架
1.认识:我们之前的代码编写中,经常会写:#import <Foundation/Foundation.h>,因为Foundation框架中包含了很多的头文件(.h)所以为 了使用Foundation中的数据类型,我们必须包含Foundation框架。
2.结构体
常用结构体:在Foundation中定义了很多常用结构体类型来简化我们的日常开发,我们经常会用到的结构体有:
1>NSRange NSRange表示一个范围
2>NSPoint (CGPoint)NSPoint表示一个点
3>NSSize (CGSize)NSSize表示大小
4>NSRect(CGRect) NSRect表示一个矩形
下面我们分别举出例子来说明各自的用法:
1>void NSRangeTest ()
{
NSRange rg={3,5};//第一参数是起始位置,第二个参数是长度
// NSRange rg={.location=3,.length=5};
NSRange rg2=NSMakeRange(3,5); //NSMakeRange定义一个NSRange
NSLog(@"rg2 is %@", NSStringFromRange(rg2));
//这里需要注意的是不能直接NSLog(@"rg2 is %@", rg2),因为rg2不是对象而是结构体
}
2> void NSPointTest()
{
NSPoint p=NSMakePoint(10, 15); // 这里的NSPoint其实就是CGPoint
NSPoint p2=CGPointMake(10, 15);
NSLog(NSStringFromPoint(p2));
}
3> voidNSSizeTest()
{
NSSize s=NSMakeSize(10, 15); //这里的 NSSize其实就是CGSize
//这种方式比较常见 CGSize s2=CGSizeMake(10, 15);
NSLog(NSStringFromSize(s2));
}
4>void NSRectTest()
{
NSRect r=NSMakeRect(10, 5, 100, 200); //这里的NSRect其实就是CGRect
//这种方式比较常见 NSRect r2=CGRectMake(10, 5, 100, 200);
NSLog(NSStringFromRect(r2));
}
3.字符串
1>不可变字符串
字符串的创建:
char *str1="C string"; // 这是C语言创建的字符串
NSString *str2=@"OC string"; // OC字符串需要加@,并且这种方式创建的对象不需要自己释放内存
字符串的转换:
void test1()
{
NSLog(@"\"Hello world!\" to upper is %@",[@"Hello world!" uppercaseString]);
//结果:"Hello world!" to upper is HELLO WORLD!
NSLog(@"\"Hello world!\" to lowwer is %@",[@"Hello world!" lowercaseString]);
//结果:"Hello world!" to lowwer is hello world!
//首字母大写,其他字母小写
NSLog(@"\"Hello world!\" to capitalize is %@",[@"Hello world!" capitalizedString]);
//结果:"Hello world!" to capitalize is Hello World!
BOOL result= [@"abc" isEqualToString:@"aBc"];
NSLog(@"%i",result);
//结果:0
NSComparisonResult result2= [@"abc" compare:@"aBc"];//如果是[@"abc" caseInsensitiveCompare:@"aBc"]则忽略大小写比较
if(result2==NSOrderedAscending){
NSLog(@"left<right.");
}else if(result2==NSOrderedDescending){
NSLog(@"left>right.");
}else if(result2==NSOrderedSame){
NSLog(@"left=right.");
}
//结果:left>right.
}
//字符串分割
void test2()
{
NSLog(@"%@",[@"abcdef" substringFromIndex:3]);//从第三个索引开始(包括第三个索引对应的字符)截取到最 后一位
//结果:def
NSLog(@"%@",[@"abcdef" substringToIndex:3]);从0开始截取到第三个索引(不包括第三个索引对应的字符)
//结果:abc
NSLog(@"%@",[@"abcdef" substringWithRange:NSMakeRange(2, 3)]);
//结果:cde
NSString *str1=@"12.abcd.3a";
NSArray *array1=[str1 componentsSeparatedByString:@"."];//字符串分割
NSLog(@"%@",array1);
/*结果:
(
12,
abcd,
3a
)
*/
}
2>可变字符串
我们知道在字符串操作过程中我们经常希望改变原来的字符串,当然这在C语言中实现比较复杂,但是ObjC为我们提供了 新的可变字符串类NSMutableString,它是NSString的子类。
#import <Foundation/Foundation.h>
int main() {
/*可变字符串,注意NSMutableString是NSString子类*/
//注意虽然initWithCapacity分配字符串大小,但是不是绝对的不可以超过此范围,声明此变量对性能有好处
NSMutableString *str1= [[NSMutableString alloc] initWithCapacity:10];
[str1 setString:@"hello"];//设置字符串
NSLog(@"%@",str1);
//结果:hello
[str1 appendString:@",world!"];//追加字符串
NSLog(@"%@",str1);
//结果:hello,world!
[str1 appendFormat:@"我的年龄是%i。dear,I love you.",18];
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。dear,I love you.
//替换字符串
NSRange range=[str1 rangeOfString:@"dear"];
[str1 replaceCharactersInRange:range withString:@"Honey"];
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。Honey,I love you.
//插入字符串
[str1 insertString:@"My name is Kenshin." atIndex:12];
NSLog(@"%@",str1);
//结果:hello,world!My name is Kenshin.我的年龄是18。Honey,I love you.
//删除指定字符串
[str1 deleteCharactersInRange:[str1 rangeOfString:@"My name is Kenshin."]];//删除指定范围的字符串
NSLog(@"%@",str1);
//结果:hello,world!我的年龄是18。Honey,I love you.
return 0;
}
4.数组
不可变数组:
voidtest1(){
//NSArray长度不可变所以初始化的时候就赋值,并且最后以nil结尾 //此外需要注意NSArray不能存放C语言的基础类型 NSObject *obj=[[NSObject alloc]init]; NSArray *array1=[NSArray arrayWithObjects:@"abc",obj,@"cde",@"opq",@25, nil]; NSLog(@"%zi",array1.count);//数组长度,结果:5 NSLog(@"%i",[array1 containsObject:@"cde"]);//是否包含某个对象,结果:1 NSLog(@"%@",[array1 lastObject]);//最后一个对象,结果:25 NSLog(@"%zi",[array1 indexOfObject:@"abc"]);//对象所在的位置:0
}
数组的遍历:
void test2(){ NSObject *obj=[[NSObject alloc]init]; NSArray *array=[[NSArray alloc] initWithObjects:@"abc",obj,@"cde",@"opq",@25, nil]; for(int i=0,len=array.count;i<len;++i){ NSLog(@"method1:index %i is %@",i,[array objectAtIndex:i]); }注意点:
1>NSArray中只能存放对象,不能存放基本数据类型,通常我们可以通过在基本数据类型前加@进行转换;
2>数组中的元素后面必须加nil以表示数据结束;
3>makeObjectsPerformSelector执行数组中对象的方法,其参数最多只能有一个;
4>上面数组操作中无论是数组的追加、删除、截取都没有改变原来的数组,只是产生了新的数组而已;
5>对象的比较除了使用系统自带的方法,我们可以通过自定义比较器的方法来实现;
可变数组:
可变数组中的元素后面必须加nil以表示数据结束;
往一个可变数组中添加一个对象,此时这个对象的引用计数器会加1,当这个对象从可变数组中移除其引用计数器减1。同时当整个数组 销毁之后会依次调用每个对象的releaes方法。
在不可变数组中无论对数组怎么排序,原来的数组顺序都不会改变,但是在可变数组中如果使用sortUsingSelector:排序原来的数组顺序 就发生了变化。