Foundation 框架中有很多对象方法和类方法,其中很多方法都是以后开发常用的工具,特别是几个集合类。
1>:NSRange 是一个结构体,里面有两个unsigned long 类型的属性,location , length 表示坐标和长度,表示一个 范围。
2>:NSPoint 或者 CGPoint 里面有两个unsigned long类型的属性,x, y 表示一个点的坐标。
3>:NSSize 或者 CGSize里面有两个unsigned long类型的属性 width , height 表示尺寸。
4>:NSRect 或者 CGRect里面有个NSPoint类型的属性,origin 和一个NSSize 类型的属性 size.
NSRange 可以用来计算一个字符串的范围
基本用法:
1:@"i love ios " 中love 的范围
NSRange r = {2,4 };
// 2 表示的是Location 位置是2 ,4 表示length 长度是4 ,在计算location 时,空格也计算在内
2:NSRange r2 = {.location 2 , .length = 4 };
// 这种赋值方式,类似于C中的数组,但是这种方式一般不用
3:也可以类似于函数使用
NSRange r3 = NSMakeRange(2,4);
// 调用了NSRange 的一个方法
查找某个字符串字符中的范围
NSString * s = @" i love ios ";
NSRange range = [s rangeofstring:@"love"];di
// 调用方法计算出字符串的所在范围
// 如果找不到这个字符串,就会返回0;此时location == NSNotFound
NSPoint的基本用法:
一般用CGPoint 表示
1:NSPoint p1 = NSMakePoint(10,10);
// 表示创建了一个点,这个点的坐标是 x = 10, y = 10;
也可以用 CGPoint p 表示
2:CGPoint p2 = CGPointMake (10,10);
1与2 等价
NSSize 和 CGSize
基本使用:
1:NSSize s = NSMakeSize(100,20);
// 创建一个新的NSSize类型,weight = 100, height = 20'
2:CGSize s1= CGSizeMake (100,20);
// 与1 等价
NSRect 和 CGRect
基本使用
赋值方式:
CGRect r1 = CGRectMake(0,0,0,0);
// 调用方法
CGRect r2 = {{0,0},{2,3}};
// 因为他里面的两个属性也是结构体类型
CGRect r3 = {p,s1};
// 利用上面创建好的结构体类型的变量
1:CGRect r1 = (0,0,0,0 );
// 创建的这个新集合是原点
输出时:
NSLog (@"x = %@,y = %@",r1.origin, r1.size);
2:上面的这种方法较为麻烦,可以改为
NSString * s = NSStringFromPoint(p);
// 将CGPoint 类型的数据转换成字符串
NSLog (@"%@",s );
// 利用输出字符串,直接输出一个CGPoint 类型的数据
NSString * s2 = NSStringFromSize(s1);
// 将CGSize 类型的数据转换成字符串
NSLog (@"%@",s2 );
// 利用输出字符串,直接输出一个CGSize 类型的数据
NSString * s3 = NSStringFromRect(s1);
// 将CGRect 类型的数据转换成字符串
NSLog (@"%@",s 3);
利用输出字符串,直接输出一个CGRect类型的数据
几个常用方法:
1:CGSizeZero 就相当于 CGSizeMake(0,0);
2:CGRectZero 就相当于 CGRectMake(0,0);
3: CGPointZero 就相当于 CGPointMake(0,0);
使用:
CGRect r4 = { CGPointZero ,CGSizeMake(20,40);
4:CGPointEqualToPoint (CGPointMake(10,4),CGPointMake(6,0));
// 判断两个点是否相同
5:CGSizeEqualToSize (CGSizeMake(10,4),CGSizeMake(6,0));
// 判断两个尺寸是否相同
6:CGRectEqualToRect(CGRectMake(10,4),CGRectMake(6,0));
// 判断两个范围是否相同
7:CGRectContainsPoint (CGRect rect, CGPoint point);
// 判断一个点是否在一个范围内
例如:
CGRectContainsPoint (CGRectMake(40,30) , CGPointMake(50,70));
// 返回值是BOOL类型
NSString 类
NSString包括了1:NSMutableString
// 可变字符串
2:NSString
// 不可变字符串
创建方式有:
1:NSString *s = @"jack";
// 最直接的一种方式
2: NSString * s2 =[[NSString alloc] initWithString:@"jack"];
// 调用了一个方法,一般不用这种方式
3:NSString * s3 = [[NSString alloc] initWithFormat:@"%d",10];
// 它能把字符串拼接起来
4: NSString * s4=[[NSString alloc] initWithUTF8String:"jack"];
// 将c语言字符串转换成oc字符串
5:const char * s5 = [ s4 UTF8string ];
// 将oc语言字符串转换成c字符串
cocoa把字符串处理封装到NSString类中了,这个类提供了字符串处理的常用方法,详细请见apple develop document
NSString *temp =[[NSString alloc] initWithString:@"test"];
//NSLog(@"%d",[temp retainCount]);
[temp release];
//NSLog(@"%d",[temp retainCount]);
NSMutableString *str=[[NSMutableString alloc] initWithString:temp];
[str appendFormat:@"NSString"];
NSLog(@"%@",str);
NSMutableString 的基本使用
NSMutableString 是可变的字符串,意味着它里面的内容可以被改变。可以添加,或者删除
例如:
NSMutableString * s1 = [NSMutableString stringWithFormat:@"age is 10"];
// 创建一个可变的字符串,里面的内容是 age is 10;
[s1 appendString:@"11 13"];
// 往s1 这个字符串中添加了 11 13;
// 这个方法没有返回值,直接在s1上添加字符
[s1 deleteCharacterInRange:NSMakeRange(2,3)];
// 删除字符串,locationg 是2 ,length 是3 的、
或者用:
NSRange range = [s1 rangeOfString:@“age”];
// 获取age 字符串在整个字符串中的位置
[s1 deleteCharacterInRange:range ];
// 利用字符串的位置来删除字符串。比1 好用
NSString * s2 = [ NSString stringWithFormat:@"age is 10"];
// 创建一个NSString类型数据
NSString * s3 = [s2 stringByAppendingString:@"11 13"];
// 这种方法也可以在 age is 10 后面加上 11 13
// 跟NSMutableString 的本质是完全不同的,他是返回了一个新的字符串s3 age is 10 11 13 ,
// 原来的s2 字符串还是 age is 10
NSArry
NSArry 可以分为两类:1:NSArry
2:NSMutableArry
NSArry 是不可变的数组,NSMutableArry 是可变的数组
NSArry类似于c语言中的数组,可以存放一组数据。但是它是存放Oc对象的数组,只能存放oc数组,不能存放基本数据类型。也不能存放nil。
1:利用c语言数组存放对象
person * p1 = [ [person alloc ] init ];
// 创建一个新的person 对象
person * p2 = [ [person alloc ] init ];
// 在创建一个新的person 对象
person * a[3] = {p1,p2};
// 设置一个数组,里面存放三个person * 类型的数据。
2:利用oc语言数组存放对象
NSObject * person[5] = {p1,[ [person alloc ] init]};
// 设置一个oc数组,里面存放5个oc对象,任何类型都可以。
1中只能存放person * 类型的数据,有局限性,是面向过程的操作
2中可以存放任何类型的数据,是以面向对象来操作数据。
NSArry 是不可变数组,里面的内容永远不能改变。
1>:例如: NSArry * a = [NSArry arry ];
// 创建一个新的oc数组,里面是空的,没有任何内容
2>: NSArry * a2 = [NSArry arryWithObject:@"jack" ];
// 创建一个新的oc数组,里面有一个元素
3>:NSArry * a3 = [NSArry arryWithObjects:@"jack" ,@"rose",nil];
// 创建一个新的oc数组,里面有2个元素
// nil 是数组元素结束的标志,会把nil 之前的所有东西当做数组元素。
4>:[a3 count];
等价于:a3.count;
// 调用这个count方法可以知道数组里面有几个元素。
2: 访问数组元素
1>: [a3 objectAtIndex:1];
// 意思是访问数组a3里面的第一个元素,就是 “rose”
2>: a3 [ 1];
// 这个是编译器特性,自动帮我们生成1 中的代码,也是访问数组中第一个元素
可以快速创建一个数组对象
NSArry * a4 = @[ @"jack",@"rose",@"jim"];
// 这个也是编译器特性,自动帮我们生成相应的代码
3:遍历数组
最基本的以前的方法:
person * P1 = [[person alloc ] init];
// 创建一个新的person 对象
NSArry * arry = @[p1,@"jack"];
// 创建一个新的数组里面有两个元素
// 设置一个for循环遍历数组
for (int i = 0; i<arry.count ; i++)
{
NSLog(@"%@",arry[i]);
// 输出数组中的每个元素
if (i==1 )
{
break;
}
}
2>: 第二种方式
for (id obj in arry )
{// id obj 代表数组里的每个元素
// 每次执行循环体都会把数组里的值,赋给 obj
NSLog(@"%@",obj);
// 打印数组里的元素
}
优缺点:这种方法较1 是简单些,可是却不能知道每次打印的是第几个元素。可以进行改进
int i = 0 ;
for (id obj in arry )
{// id obj 代表数组里的每个元素
// 每次执行循环体都会把数组里的值,赋给 obj
NSLog(@"%@",obj);
// 打印数组里的元素
i++;
NSLog(@"%d",i);
}
或者用
for (id obj in arry )
{// id obj 代表数组里的每个元素
// 每次执行循环体都会把数组里的值,赋给 obj
NSUInteger i = [arry indexOfObject:obj ];
// 调用一个方法知道当下的obj在数组是第几个元素
NSLog(@" %d-%@",i,obj);
// 打印数组里的元素,和它所在的位置。
}
3:最常用的方法:
[arry enumerateObjectUsingBlock:^(id obj , NSUInteger idx, Bool * stop)
{
// 调用了block 方法,把一个block 作为一个形参传入进去,并且这个block 接受三个参数
NSLog(@" %ld-%@",idx,obj);
// id obj 代表当前元素,idx 代表元素所在位置
// 没拿到一个数组元素就会调用一次block,并且把元素传入block。
}]
其实上述方法内部有个for 循环来判断什么时候停止遍历。内部是用Bool * stop 来设置 遍历的停止或者进行。
当stop 是yes 时,停止,当stop 是 no 时,接着遍历。