结构体
1.NSRange
NSRange的本质是结构体,它包含两个成员变量——location 和length。它的作用就是表示一个范围,如:
NSString *str = @"i love oc";
NSRange range = [str rangeOfString:@"love"];// 查找某个字符串在str中的范围,如果找不到,length=0,location=NSNotFound==-1
NSLog(@"loc = %ld, length=%ld", range.location, range.length);
2.NSPoint\CGPoint
NSPoint无条件等价于CGPoint,下面列举常用的创建NSPoint\CGPoint的方法。
CGPoint p1 = NSMakePoint(10, 10);
NSPoint p2 = CGPointMake(20, 20);
其中第一种不常用,常用第二种方法来创建。
3. NSSize\CGSize
同样NSSize\CGSize也是等价的,创建方法如下:
NSSize s1 = CGSizeMake(100, 50);
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = NSMakeSize(200, 60);
4. NSRect\CGRect (CGPint CGSize)
NSRect\CGRect 包含上面所说的CGPint 和CGSize,常用创建方法:
CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
另外在oc中表示原点有两种方法:
(1)CGPointZero
(2)CGPointMake(0, 0))
这两种方法都可以表示坐标原点。同样也有CGSizeZero和CGRectZero。
5.oc提供将结构体转换为字符串的方法:
(1)NSString *str = NSStringFromPoint(p1);
(2)NSString *str = NSStringFromSize(s3);
(3) NSString *str = NSStringFromRect(r1);
字符串
1.NSString : 不可变字符串
创建:
(1)NSString *s1 = @"jack";
(2)NSString *s2 = [[NSString alloc] initWithString:@"zhang"];
(3)NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 25];
其中第二种几乎不用。
转换:
(1)C字符串 --> OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
(2)OC字符串 --> C字符串
const char *cs = [s4 UTF8String];
从文件中初始化字符串
NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/zhangjianbin/Desktop/zhang.txt" encoding:NSUTF8StringEncoding error:nil];
2. NSMutableString : 可变字符串
NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];
注意区分:
NSString *s2 = [NSString stringWithFormat:@"age is 10"];
NSString *s3 = [s2 stringByAppendingString:@" 11 12"];
这种看着好像NSString 也可以追加,但是它本质是生成了一个新的字符串,原来的字符串并没有改变。
oc数组
1.NSArray :不可变数组
创建:
NSArray *array2 = [NSArray arrayWithObject:@"zhang"];
NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];
其中是数组元素结束的标记,不可省略
NSArray *array4 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil];
其实我们很少使用上面的方法,我们可以快速创建一个NSArray对象,如:
NSArray *array4 = @[@"jack", @"rose", @"4324324"];
但是这样创建出来的是不可变数组。
2.NSMutableArray : 可变数组
(1)创建:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"zhang", @"jian", nil];
(2)添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"bin"];
(3) 删除元素
[array removeAllObjects];
删除指定的对象
[array removeObject:@"zhang"];
[array removeObjectAtIndex:0];
(4)错误写法
NSMutableArray *array = @[@"jack", @"rose"];
因为快速创建数组的方法只适用于不可变数组。
[array addObject:nil];
(5)遍历数组
NSMutableArray *array = @[@"jack", @"rose"];
NSArray *array = @[@"rose", @"jack"];
//第一种方法
for (int i = 0; i<array.count; i++)
{
NSLog(@"%@", array[i]);
}
//第二种方法
id obj代表着数组中的每一个元素
int i = 0;
for (id obj in array)
{
// 找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
//i++;
if (i==1)
{
break;
}
}
//第三种方法
[array enumerateObjectsUsingBlock:
每遍历到一个元素,就会调用一次block
并且当前元素和索引位置当做参数传给block
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
}];
3.NSSet
其实NSSet和NSArray差不多,只是NSSet中的存放时无序的。它们有很多共同点:
(1)都是集合,都能存放多个OC对象
(2)只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
(3)本身都不可变,都有一个可变的子类
字典
1.创建
(1)NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
(2)NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"zhang", @"henan"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
(3)NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"zhang", @"name",
@"henan", @"address",
@"123456", @"qq", nil];*/
(4) NSDictionary *dict = @{@"name" : @"zhang", @"address" : @"henan"};
第四种是快速创建,一般常用此方法。
2.成员访问
(1)id obj = [dict objectForKey:@"name"];
但是这种方法感觉麻烦,编译器给我们提供了另外一种更方便的方法:
id obj = dict[@"name"];
其实他的本质也是生成上面的的代码。
NSNumber
我们知道在foundation中很多地方不让传入基本数据类型,只让传入对象,但是有时候我们很想传入基本数据类型,这个时候就应该想办法把基本数据类型转化为对象类型,如
NSNumber *num = [NSNumber numberWithInt:10];
NSDictionary *dict = @{
@"name" : @"jack",
@"age" : num
};
这样我们就将10转化成了对象类型,同时我们还可以将它转化回来,如:
int a = [num intValue];
其实不仅仅是整形可以转化,其他基本数据类型如结构体,枚举,double,float等等数据类型也可以转化。这就要用到NSValue,其实NSNumber是继承自NSValue的。