[TOC]
OC学习
数据类型 (精通C的没必要看这部分)
基本数据类型
整型 | 浮点型 | 字符型 |
---|---|---|
int | float / double | char |
修饰词
short | long | signed | unsigned |
---|---|---|---|
int / double | int / doubel | int / char | int / char |
TIPS
- 这些限定词经常用来限定int型,在限定int类型时int可以省略;
- short和long会改变int型的长度,在不同编译器长度不相同,但是一般short长度不大于int,int长度不大于long;
- signed和unsigned不会改变类型长度,仅表示最高位是否为符号位,其中unsigned表示大于等于0的正数;
取值范围
int | unsigned int | short | unsigned short | long | unsigned shot |
---|---|---|---|---|---|
-2147483648 ~ 2147483647 | 0~4294967295 | -32768~32767 | 0~65535 | -2147483648~2147483647 | 0~4294967295 |
存储空间
数据类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
char | 1byte | 1byte | 1byte |
int | 2byte | 4byte | 4byte |
float | 4byte | 4byte | 4byte |
double | 8byte | 8byte | 8byte |
short int | 2byte | 2byte | 2byte |
unsigned int | 2byte | 4byte | 4byte |
long | 4byte | 4byte | 8byte |
unsigned long | 4byte | 4byte | 8byte |
long long | 8byte | 8byte | 8byte |
TIPS
关于这些基本数据类型,平时用的时候有几点需要注意一下:
- char类型是最小的数据类型(任意编译器下都是占1Byte),char类型的变量可以赋值某个字符、也可以赋值ASCII值;
- 可以使用long long来修饰一个整型,但是long long不能修饰double;
- 不存在short short;
- 浮点型常量后面加f,编译器认为是float类型,否则是double类型;
数字、字符串和集合数据对象
数字对象NSNumber
专门用来封装基础类型的对象,把整型、单精度、双精度、字符型等基础类型存储为对象
//基本数据类型
//专门用来封装基础类型的对象
NSNumber * intNumber = [[NSNumber alloc] initWithInt:5];
NSNumber * floatNumber = [[NSNumber alloc] initWithFloat:3.14f];
NSNumber * doubleNumber = [[NSNumber alloc] initWithDouble:6.7];
NSNumber * charNumber = [[NSNumber alloc] initWithChar:'A'];
NSNumber * intNumber2 = [NSNumber numberWithInt:6];
**判断两个NSNumber是否相等 **
BOOL ret = [intNumber isEqualToNumber:intNumber2]; //这种比较也是可以跨不同对象的,比如:比较intNumber和floatNumber
**比较两个整型的NSNumber的大小 **
//比较两个整型的NSNumber的大小
if ([intNumber compare:intNumber] == NSOrderedAscending) {
NSLog(@"<");
}else if([intNumber compare:intNumber2] == NSOrderedSame){
NSLog(@"=");
}else if([intNumber compare:intNumber2] == NSOrderedDescending){
NSLog(@">");
}
**通过以下方法可以还原这些基本数据类型的数据 **
NSLog(@"%d", [intNumber intValue]);
NSLog(@"%f", [floatNumber floatValue]);
NSLog(@"%f", [doubleNumber doubleValue]);
NSLog(@"%c", [charNumber charValue]);
字符串对象NSString
- 创建字符串对象
NSString *str = @"Hello world!";
NSString *str2 = [[NSString alloc] initWithString:str];
NSString *str3 = [[NSString alloc] initWithUTF8String:"hello world"]; //用C的字符串创建OC的字符串对象
NSString *str4 = [[NSString alloc] initWithFormat:@"hello %d %c",5,'A']; //使用格式符拼接成一个字符串
临时字符串,不需要进行release
NSString *str5 = [NSString stringWithUTF8String:"hellow world"];
NSString *str6 = [NSString stringWithFormat:@"%d %@ %c",1,@"hello",'R'];
NSString *str7 = [NSString stringWithString:str];
- 字符串的方法
NSString *str = @"hello world!";
NSString *str2 = @"hello word!";
判断两个字符串是否相等
BOOL ret = [str isEqualToString:str2];
NSLog(@"%d", ret);//返回true或者false,由于返回值是0或1,所以用%d
比较两个字符串的大小
//比较两个字符串的大小
NSComparisonResult comRet = [str compare:str2]; //NSComparisonResult是一个枚举,返回值NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
if(comRet == NSOrderedAscending){
NSLog(@"str < str2");
}
else if(comRet == NSOrderedSame){
NSLog(@"str == str2");
}
else if(comRet == NSOrderedDescending){
NSLog(@"str > str2");
}
** 查找字符串的位置**
NSString *str = @"I am a so bad man.";
NSString * subStr = @"so";
NSRange range = [str rangeOfString:subStr];//查找subStr在str中的位置,返回NSRange -- 返回位置和长度
NSLog(@"location:%lu, %lu",range.location,range.length);
** 获取子字符串**
NSString *str = @"0123456789";
NSString *str2 = [str substringToIndex:6]; //从str中提取从头至第6个字符串(不包括第6个),生成新字符串,返回字符串地址。
NSString *str3 = [str substringFromIndex:6]; //从str中提取第6个字符(包括第6个),到最后一个字符,生成新字符串,返回字符串地址
//根据指定范围提取字符串
NSRange range = {3, 4};//3表示起始位置,4表示长度
NSString *str4 = [str substringWithRange:range];
NSString *str5 = [str substringWithRange:NSMakeRange(3, 4)];//与上面相同,NSMakeRange直接返回Range
- 可变字符串 (NSMutableString)
继承自字符串,拥有以上的所有方法:包括创建、提取、比较等,但是也增加了一些方法
不能用这个方法创建可变字符串:NSMutableString *str = @"Hello world!";
其他的创建方法都可以。
增加的方法:增、删、改、查
NSMutableString *str = [[NSMutableString alloc] init];
[str setString:@"hello"]; //设置可变字符串的内容,再次设置就会发生替换字符串内容
//增,两种方式:追加、插入
[str appendString:@"123"]; //追加append,在结尾处字符串
[str appendFormat:@"%c",'R']; //追加append,在结尾处追加格式符
[str insertString:@"XXXX" atIndex:4]; //插入insert,在Index位置插入
//删,delete
[str deleteCharactersInRange:NSMakeRange(3, 5)]; //从第3个开始,删除5个字符
//改,replace
[str replaceCharactersInRange:NSMakeRange(3, 2) withString:@"RRRRRRRR"];
数组对象NSArray
- 数组的初始化
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", @"Four", nil];
数组的元素可以是任意的对象,不局限于字符串;
数组中装有元素的地址;
NSLog(@"%@", array); //打印数组,实际上是打印数据的每一个对象。因为数组重写的Description方法
遍历数组中的对象
- 枚举器法
NSEnumerator *enumerator = [array objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
NSLog(@"%@", obj);
}
- 快速枚举法
for(id obj in array){
NSLog(@"%@", obj);
}
- 使用下标i
NSUInteger length = [array count]; //返回数组元素的个数
obj = [array objectAtIndex:2]; //返回单个元素的地址
NSInteger i;
for(i = 0; i<[array count];i++){
NSLog(@"%@", [array objectAtIndex:i]);
}
- 可变数组
NSMutableArray *array = [[NSMutableArray alloc] init];
//往可变数组中添加元素
[array addObject:@"one"];
[array addObject:@"two"];
[array addObject:@"three"];
交换两个数组的位置
[array exchangeObjectAtIndex:0 withObjectAtIndex:2];
删除元素,remove
[array removeObject:@"one"];
[array removeObjectAtIndex:1];
[array removeAllObjects];
同时遍历和删除数组元素的时候,需要逆序;否则,会出现问题
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
//逆序
NSEnumerator *enumerator = [array reverseObjectEnumerator];
NSString *str;
while (str = [enumerator nextObject]) {
[array removeLastObject];
NSLog(@"%@",str);
}
NSLog(@"%@",array);
- 数组和字符串的联合使用
将一个字符串逆序输出
NSString *str = @"I am a so bad man";
NSArray *array = [str componentsSeparatedByString:@" "]; //用空格分割字符串
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
NSEnumerator *enumerator = [array reverseObjectEnumerator];
NSString *obj;
while (obj = [enumerator nextObject]) {
[mutableArray addObject:obj];
}
NSString *newStr = [mutableArray componentsJoinedByString:@" "]; //用指定的字符串,拼接字符串
字典对象NSDictionary
- 字典NSDictionary
字典与数组的区别:数组讲究顺序,而字典可以快速帮助我们找到数据,数据是我们的目的,键是我们的手段
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3", nil];
字典中的元素是以键值对的形式存储的
@"one"和@"1"组成了一个键值对
@"one"称为值(value)@"1"称为键(key)
键值对的键和值,都是任意的对象,但是键往往使用字符串
字典存储对象的地址没有顺序
字典的遍历分为:键的遍历和值的遍历
NSEnumerator *enumeratorKey = [dict keyEnumerator]; //键的遍历
NSEnumerator *enumeratorValue = [dict objectEnumerator]; //值的遍历
通过键快速的找到值
NSString *str = [dict objectForKey:@"1"];
快速枚举法
for(id obj in dict){ //这种方式遍历到的是键Key,获得了键,也就获得了值
NSLog(@"%@",obj);
NSLog(@"%@",[dict objectForKey:obj]);
}
- 可变字典NSMutableDictionary,是字典的子类,拥有字典的所有方法,并且有一些自己的方法。
//初始化
NSMutableDictionary *mDict = [[NSMutableDictionary alloc] init];
添加键值对(set)
//添加
[mDict setObject:@"one" forKey:@"1"];
[mDict setObject:@"two" forKey:@"2"];
删除键值对(remove)
//删除
[mDict removeObjectForKey:@"1"];
集合对象NSSet
- 集合
集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。
集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。
NSSet * set = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
[set count]; //返回集合中对象的个数
判断集合中是否拥有某个元素
//判断集合中是否拥有@“two”
BOOL ret = [set containsObject:@"two"];
判断两个集合是否相等
NSSet * set2 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
//判断两个集合是否相等
BOOL ret = [set isEqualToSet:set2];
判断set是否是set2的子集合
NSSet * set2 = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four",@"five", nil];
//判断set是否是set2的子集合
BOOL ret = [set isSubsetOfSet:set2];
集合也可以用枚举器来遍历
//集合也可以用枚举器来遍历
NSEnumerator * enumerator = [set objectEnumerator];
NSString *str;
while (str = [enumerator nextObject]) {
……
}
通过数组来初始化集合(数组转换为集合)
NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSSet * set = [[NSSet alloc] initWithArray:array];
集合转换为数组
NSArray * array2 = [set allObjects];
- 可变集合NSMutableSet
//可变集合NSMutableSet
NSMutableSet * set = [[NSMutableSet alloc] init];
[set addObject:@"one"];
[set addObject:@"two"];
[set addObject:@"two"]; //如果添加的元素有重复,实际只保留一个
删除元素
//删除元素
[set removeObject:@"two"];
[set removeAllObjects];
并集(A∪B={x|x∈A,或x∈B})
//将set2中的元素添加到set中来,如果有重复,只保留一个
NSSet * set2 = [[NSSet alloc] initWithObjects:@"two",@"three",@"four", nil];
[set unionSet:set2];
差集合
//删除set中与set2相同的元素
[set minusSet:set2];
- 指数集合(索引集合)NSIndexSet
//指数集合(索引集合)NSIndexSet
NSIndexSet * indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 3)]; //集合中的数字是123
根据集合提取数组中指定位置的元素
//根据集合提取数组中指定位置的元素
NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSArray * newArray = [array objectsAtIndexes:indexSet]; //返回@"two",@"three",@"four"
- 可变指数集合NSMutableIndexSet
NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc] init];
[indexSet addIndex:0]
[indexSet addIndex:3];
[indexSet addIndex:5];
//通过集合获取数组中指定的元素
NSArray *array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four",@"five",@"six", nil];
NSArray *newArray = [array objectsAtIndexes:indexSet]; //返回@"one",@"four",@"six"