Foundation框架中最常使用的类大概有这么几种:NSString、NSArray、NSDictionary以及他们的可变类:NSMutableString、NSMutableArray、NSMutableDictionary。虽然说不必记住每个类提供的方法,但是一定要有概念,以便用到的时候可以去源码中查找,而减少时间消耗。
NSString&NSMutableString
NSString是一个数据类型,用来保存OC字符串,常见的创建方式有以下几种:
NSString *str1 = [[NSString alloc]init];
str1 = @"喵了个咪";
NSString *str2 = [NSString stringWithFormat:@"hahaha%dxixixix%d",123,456];
NSString *str3 = [NSString stringWithUTF8String:"你本无意穿堂风"];
NSString *str4 = [NSString stringWithCString:"偏偏倨傲引山洪" encoding:NSUTF8StringEncoding];
输出结果:
NSString常用的方法:
//返回字符串的长度。
@property (readonly) NSUInteger length;
//得到字符串中指定下标的字符,打印的话使用%C。
- (unichar)characterAtIndex:(NSUInteger)index;
//判断当前字符串对象和传入的字符串对象的内容是否相同。
- (BOOL)isEqualToString:(NSString *)aString;注意:不可以使用==来判断两个OC字符串的内容是否相同
//将字符串写入到指定的文件中。
- (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
//将文件中的内容读取到字符串中.
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
//判断字符串是否以指定的字符串开头
- (BOOL)hasPrefix:(NSString *)str;
//判断字符串是否以指定的字符串结尾
- (BOOL)hasSuffix:(NSString *)str;
//在主串中搜索子串.从前往后搜索. 第1次匹配的子串.
- (NSRange)rangeOfString:(NSString *)searchString;
//在主串中搜索子串.从后往前搜索. 第1次匹配的子串.
NSString *str = @"www.baidu.com";
NSRange range = [str rangeOfString:@"com" options:NSBackwardsSearch];
/*
返回值是1个NSRange类型的结构体变量.
typedef struct _NSRange {
NSUInteger location; 代表子串在主串出现的下标.
NSUInteger length; 代表子串在主串中匹配的长度.
}
*/
//字符串截取
- (NSString *)substringFromIndex:(NSUInteger)from; 从指定的下标出一直截取到最后.
- (NSString *)substringToIndex:(NSUInteger)to; 从第0个开始截取指定的个数.
- (NSString *)substringWithRange:(NSRange)range; 截取指定的1段范围
//字符串替换
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
NSMutableString
NSMutableString继承自NSString,并对NSString进行了扩展,同样用来存储字符串。与NSString不同的是,无论NSMutableString修改多少次,对象始终只有一个,每次修改字符串的时候,只是在修改该对象的值。
NSMutableString具有NSString的所有方法,此外还有追加函数:
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... ;
需要注意的是,NSMutableString不能直接用字符串常量去初始化。原因也很好理解,当子类指针指向父类,调用子类方法的时候,会出错。
NSArray
数组,但是元素只能是OC对象,不能是非OC对象,所以基本数据类型等非OC对象需要转化为OC对象才可以存储。并且NSArray是不可变得,一旦初始化完毕之后,它里面的元素就永远是固定的,无法删除和新增元素。
常用的创建方法:
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
2.+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;创建并返回包含另一给定数组中的对象的数组
NSArray *givenArr = @[@"嘻嘻", @"哈哈", @"嘿嘿", @"呵呵",];
NSArray *arr1 = [NSArray arrayWithArray:givenArr];
3.+ (instancetype)arrayWithObject:(ObjectType)anObject;创建并返回一个包含给定对象的数组。
NSArray *arr2 = [NSArray arrayWithObject:@""];
4.+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...;创建并返回一个包含参数列表中的对象的数组。
NSArray *arr3 = [NSArray arrayWithObjects:[NSDate date], @"回眸三生琥珀色",@"转身一世琉璃白",@999,nil];
NSArray遍历
1.for循环
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
for(NSInteger i = 0; i < arr.count; i++)
{
NSString *str = arr[i];
NSLog(@"for --> %@",str);
}
2.for in
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
for (NSString *str in arr) {
NSLog(@"for in --> %@",str);
}
值得注意的是:如果数组内元素的类型不止一种,可以用id类型进行遍厉。
3.- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block ;
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"第%ld个元素:%@",idx,obj);
}];
obj:代表便利出来的元素的值 , idx:代表元素的下标,如果希望停止遍历,将stop指针指向的变量赋值为NO即可。
常见用法
1.- (NSString *)componentsJoinedByString:(NSString *)separator;将数组中的所有元素用separator拼接成一个字符串。
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
NSString *str = [arr componentsJoinedByString:@"&"];
NSLog(@"%@",str);
2.- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;字符串提供的分割字符串组成数组的方法
NSArray *arr = @[@"桃之夭夭",@"灼灼其华",@"之子于归",@"宜其家室"];
NSString *str = [arr componentsJoinedByString:@"&"];
NSArray *arr1 = [str componentsSeparatedByString:@"&"];
}
NSMutableArray
NSMutableArray是NSArray的子类,所以NSMutableArray拥有NSArray的所有方法,此外身为可变数组,所以存储在NSMutableArray中的元素可以删除,NSMutableArray也可以动态增加元素。
一些常用方法:
添加:
NSArray *addArr = @[@"之子于归",@"远送于野"];
NSMutableArray *marr = [[NSMutableArray alloc]init];
//NSMutableArray不能使用@[]创建,因为语法糖创建的是不可变数组。
[marr addObject:@"燕燕于飞"];
[marr insertObject:@"差池其羽" atIndex:1];
[marr addObjectsFromArray:addArr];
删除:
- (void)removeLastObject; // 删除最后一个元素
- (void)removeObjectAtIndex:(NSUInteger)index; // 删除指定元素
- (void)removeAllObjects; // 删除所有元素
- (void)removeObject:(ObjectType)anObject; // 删除指定元素
- (void)removeObjectIdenticalTo:(ObjectType)anObject; // 删除与之相同的元素
- (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray; // 删除与另一数组中元素相同的元素
NSDictionary
NSDictionary以键值对的形式存储数据,唯一的key对应value,通过key来找到存储在字典中的value。同NSArray一样,NSDictionary字典一旦创建完毕,其键值对的个数就已经固定,无法删除,新增。
常见创建方法:
NSDictionary *dict = @{@"name":@"Wind",@"age":@28};
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"name",@"sunshine",@18,@"age", nil];
NSDictionary *dict2 = [NSDictionary dictionaryWithDictionary:dict1];
NSDictionary常见方法
// 获取字典中键值对的个数
NSInteger count = dict.count;
//获取字典中的值
id obj = [dict objectForKey:@"name"];
//等价于
id obj1 = dict[@"name"];
NSMutableDictionary
NSMutableDictionary是NSDictionary的子类,拥有NSDictionary的所有方法,并且可以进行增加和删除。
常用的删除和增加
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey; // 添加键值对
- (void)removeObjectForKey:(KeyType)aKey; //删除key对应的键值对
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray; // 删除数组中所有key的键值对
- (void)removeAllObjects; // 删除所有的键值对
NSData
NSData为二进制数据,在文件操作(如保存到本地)、网络、以及核心图形图像中使用较广泛
NSData创建:
//对象方法创建
NSData *data1 = [[NSData alloc] init];
NSData *data2 = [[NSData alloc] initWithData:data1];
// 由 字符串 创建
NSString *string = @"我见众人皆草木,唯你是青山";
NSData *data3 = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *data4 = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
//由文件创建
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];
NSData *data5 = [[NSData alloc] initWithContentsOfFile:filePath];
NSData *data6 = [NSData dataWithContentsOfFile:filePath];
// 由 URL 创建
NSURL *urlPath = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]]];
NSData *data7 = [[NSData alloc] initWithContentsOfURL:urlPath];
NSData *data8 = [NSData dataWithContentsOfURL:urlPath];
NSData与别的数据类型的转换
与UIImage
//UIImage 转换成 NSData
NSData *imageData1 = UIImagePNGRepresentation(UIImage *image); //png 格式
NSData *imageData2 = UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality) //jpeg格式
//NSData 转换成 UIImage
UIImage *aimage = [UIImage imageWithData: imageData];