(41)NSURL
NSURL对象:专门用来保存资源地址的。
资源路径的地址的写法:
http://:网页路径
file://:磁盘路径
ftp://:FTP文件资源路径
如何将资源地址存储到NSURL对象中
NSURL *url1 = [NSURL URLWithString:@"https://www.baidu.com/"];
NSURL *url2 = [NSURL URLWithString:@"ftp://server.itcast.cn/ccc.txt"];
NSURL *url3 = [NSURL URLWithString:@"file:///Users/Apple/Desktop/abc.txt"];
读取 NSURL 对象中保存的路径的文件数据
+(nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
NSError *err;
NSURL * u1 = [NSURL URLWithString:@"https://blog.csdn.net/panjiye82/"];
//读取 NSURL 对象中保持的路径的文件数据.
NSString * htmlcode = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:&err];
if (err != nil) {
NSLog(@"%@",err.localizedDescription);
}
else{
NSLog(@"%@",htmlcode);
}
向 NSURL 对象保持的地址写入字符串数据
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
NSError *err;
NSURL * u1 = [NSURL URLWithString:@"file:///Users/babylon/Desktop/code/day9_oc/day09/day09/haowai.txt"];
NSString * str = @"最新消息,最新消息:刘铁柱暴打王大锤不成,王大锤反杀刘铁柱!!";
//- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
//向 NSURL 对象保持的地址写入字符串数据.
BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:&err];
//第一种判断方式:
NSLog(@"%@",res==YES?@"写入成功!":@"写入失败!");
//第二种判断方式:
if (err != nil) {
NSLog(@"%@",err.localizedDescription);
}
else{
NSLog(@"写入成功!");
}
(42)NSMutableString
为什么要用NSMutableString
一旦创建1个字符串对象,那么这个字符串对象的内容就无法更改, 当我们修改字符串的时候, 其实是重新的创建了1个字符串对象.
因此,当我们大量在字符串中拼接字符串时,每次都会创建一个对象,会非常慢;
但NSMutableString是从NSString继承的子类,存储在NSSMutableString对象中的字符串数据可以更改具备可变性,不会每次都创建一个新对象,进而在进行大量(10次以上)的字符串拼接时,显著提升效率;
如何定义
NSMutableString *str = [NSMutableString string];
往可变字符串对象中追加内容:
- (void)appendString:(NSString *)aString; //直接追加内容.
NSMutableString *str = [NSMutableString string]; //创建一个空的可变字符串
[str appendString:@"hhhh"]; //往字符串中添加字符
使用建议
我们平时使用的时候,还是使用NSString. 因为效率高
如果大批量拼接时可以使用NSMutableString
(43)NSArray
定义
NSArray是OC中的数组
1、只能存储OC对象
2、长度固定,无法新增和删除
3、每个元素是id类型的
数组创建
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
这样创建出来的NSArray数组的元素的个数是0个,因为长度固定,所以没有任何意义.
常用方式
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ...
NSArray * arr = [NSArray arrayWithObjects:@"王大锤",@"刘铁柱",@"Tom",@"Jerry",nil];
// 将元素写完以后,最后要写1个nil 表示元素到此结束了.
// 取值,调用数组对象的对象方法来取出指定下标的元素的值.
NSLog(@"%@",[arr objectAtIndex:1]);
简写
NSArray * arr = @[@"王大锤",@"刘铁柱",@"Tom",@"Jerry"];
// 注意: 这种创建方式 不需要在最后加nil.
// 取值
NSArray *arr = @[@"jack",@"vbb"];
NSLog(@"%@",arr); // (jack,vbb)
NSLog(@"%@",arr[1]); // vbb
NS数组的其他常用方法
获取数组长度
count(NSUInteger)
NSLog(@"%lu",arr.count);
是否包含指定元素
containsObject(BOOL)
NSLog(@"%@",isInclude == YES ? @"YES":@"NO");
获取数组的第一个元素
firstObject
NSLog(@"%@",arr.firstObject); // jack
与arr[0]的区别:如果数组中没有任何元素arr[0]报错。firstObject取到nil 不报错
获取数组的最后一个元素
lastObject
NSLog(@"%@",arr.lastObject); // hhhh
获取指定元素在数组中第一次出现的位置
indexOfObject(NSUInteger)
NSLog(@"%lu",[arr indexOfObject:@"vbb"]); // 1
遍历数组
for循环遍历:
for(NSString * str in arr)
{
NSLog(@"%@",str);
}
block遍历:
// - (void) enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL * stop)) block;
// enumerateObjectsUsingBlock是Foundation 框架提供的一个方法
// obj:集合当中的元素
// idx:当前元素在集合中的索引
// stop:一个指向布尔值的指针,如果设置*stop=YES,则遍历将提前结束
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
NSLog(@"%@",obj);
}];
数据元素拼接为字符串
componentsJoinedByString
NSArray *arr = @[@"jack",@"vbb",@"hhhh"];
NSString *res = [arr componentsJoinedByString:@","]; // 将,作为数组元素的连接符
NSLog(@"%@",res); //jack,vbb,hhhh
字符串拆分为数组
componentsSeparatedByString
NSString *str = @"jack,vbb,hhhh";
NSArray *arr = [str componentsSeparatedByString:@","];
NSLog(@"%@",arr); // [jack,vbb,hhh]
(44)NSMutbaleArray
NSMutableArray是NSArray的子类,NSMutableArray数组的元素可以动态的新增和删掉,其余的方法跟NSArray相同;
NSMutableArray * arr1 = [NSMutableArray array];
NSMutableArray * arr2 = [[NSMutableArray alloc] init];
NSMutableArray * arr3 = [NSMutableArray new];
NSMutableArray * arr4 = [NSMutableArray arrayWithObject:@"王大锤"];
NSMutableArray * arr5 = [NSMutableArray arrayWithObjects:@"王大锤",@"刘铁柱",nil];
这样创建出来的是空数组,元素为0,但我们可以动态的增删;
但NSMUtableArray不可以通过NSMultableArray *arr = @[@"jack",@"hh"]创建数组,因为@[@"jack",@"hh"]是一个NSArray对象,如果使用子类指针指向父类对象会出现问题;
新增元素
addObject
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"hh"];
NSLog(@"%@",arr1); //[hh]
数组拼接
addObjectsFromArray
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"Lizard"];
NSArray *arr2 = @[@"Tom",@"Jerry"];
[arr1 addObjectsFromArray:arr2];
NSLog(@"%@",arr1); // ["Lizard","Tom","Jerry"]
指定位置插入元素
insertObject:atIndex:
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry", nil];
[arr1 insertObject:@"new" atIndex:1];
NSLog(@"%@",arr1); // ["Tom","new","Jerry"]
删除指定位置的元素
removeObjectAtIndex
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry", nil];
[arr1 removeObjectAtIndex:1];
NSLog(@"%@",arr1); // ["Tom"]
删除所有指定的元素
removeObject
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry",@"Tom", nil];
[arr1 removeObject:@"Tom"];
NSLog(@"%@",arr1); // ["Jerry"]
删除最后一个元素
removeLastObject
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry",@"Tom", nil];
[arr1 removeLastObject];
NSLog(@"%@",arr1); // ["Tom","Jerry"]
替换指定位置的元素
replaceObjectAtIndex: withObject:
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry",@"Tom", nil];
[arr1 replaceObjectAtIndex:2 withObject:@"Madam"];
NSLog(@"%@",arr1); // ["Tom","Jerry","Madam"]
删除所有元素
removeAllObjects
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry",@"Tom", nil];
[arr1 removeAllObjects];
NSLog(@"%@",arr1); // []
删除某个范围内的指定元素
removeObject: inRange:
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"Tom",@"Jerry",@"Jerry",@"Madam",@"Tom", nil];
[arr1 removeObject:@"Jerry" inRange:NSMakeRange(1,3)];
NSLog(@"%@",arr1); // ["Tom","Madam","Tom"]
(45)NSNumber
无论是NSArray还是NSMutbaleArray里面都只能存储OC对象,无法存储基本数据类型;
如果想要把基本数据类型存储到数组中,则需要先将基本数据存储到NSNumber中,然后将NSNumber指针对象存到NSArray中;
NSNumber *num1 = [NSNumber numberWithInt:2];
NSNumber *num2 = [NSNumber numberWithChar:'c']; //这种方式会将字符串转换为ASCII码
NSNumber *num3 = [NSNumber numberWithFloat:10.4f];
NSNumber *num4 = [NSNumber numberWithDouble:3.1415926];
NSMutableArray *numArr = [NSMutableArray arrayWithObjects: num1, num2, num3, num4, nil];
NSLog(@"%@",numArr); //[2, 99, 10.4, 3.1415926]
那么如何简写?
NSArray *numArr = @[@"2",@"c",@"10.4",@"3.1415926"];
NSLog(@"%@",numArr); //[2, c, 10.4, 3.1415926]
(46)NSDictionary
定义与特点
NSDictionary:字典数组
1、以键值对的形式存储数据
2、字典数组一旦创建,其中的元素就无法动态的新增和删除。
3、键: 只能是遵守了NSCoping协议的对象,而NSString就是遵守了这个协议。
值: 只能是OC对象。
4、往字典数组中存储键值对的时候,键不允许重复,如果键重复, 后加的无效。
由于NSDictionary与NSArray类似得特性,导致NSDictionary在创建时,如果默认创建一个空的字典数组也没有什么意义;
因此创建时最好初始化键值对
一般创建方式
+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ...,将字典的值键,依次进行初始化
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Tom",@"Name",@"Male",@"gender", nil];
NSLog(@"姓名:%@",dict[@"Name"]); // Tom
NSLog(@"性别:%@",dict[@"gender"]); // Male
简要创建方式
NSDictionary *dict = @{键1:值1,键2:值2,键3:值3,........}
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male"};
NSLog(@"姓名:%@",dict[@"Name"]); // Tom
NSLog(@"性别:%@",dict[@"Gender"]); // Male
取单个值
直接取值:字典名[@"键名称"]
或者调用字典的方法取值:[字典名 objectForKey:@"键名称"]
如果给定的key在数组中不存在,取到的值是null 不会报错。
获取字典中有多少个键值对
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male"};
NSLog(@"%lu",dict.count); // 2
取字典中全部的键
allKeys
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male"};
NSLog(@"%@",dict.allKeys); // ["Gender","Name"]
取字段中全部的值
allValues
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male"};
NSLog(@"%@",dict.allValues); // ["Male","Tom"]
取字典中所有与指定值对应的键
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male",@"Parents":@"Tom"};
NSLog(@"%@",[dict allKeysForObject:@"Tom"]); // ["Name","Parents"]
遍历字典
for循环遍历
因为字典无法通过下标取值,所以普通的for循环已经不起作用了;只能使用for…in
block遍历
NSDictionary *dict = @{@"Name":@"Tom",@"Gender":@"Male",@"Parents":@"Tom"};
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@ = %@",key,obj);
}];
// Gender = Male
// Name = Tom
// Parents = Tom
(47)NSMutableDictionary
可变字典数组,可增加或删除键值对
创建
NSMutableDictionary *dict1 = [NSMutableDictionary new];
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
可创建空字典,因为后续可增加键值对,但同样的,不能使用简写的形式创建;
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Jack",@"Name",
@"18",@"Age",
@"Male",@"Gender",
nil];
NSLog(@"%@",dict);
/**
{
Age = 18;
Gender = Male;
Name = Jack;
}
*/
新增键值对
[字典名称 setObject: forKey:]
如果键重复,后添加的就会替换原有的。
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Jack",@"Name",
@"18",@"Age",
@"Male",@"Gender",
nil];
[dict setObject:@"Chinese" forKey:@"National"];
NSLog(@"%@",dict);
/**
{
Age = 18;
Gender = Male;
Name = Jack;
National = Chinese;
}
*/
删除所有键值对
removeAllObjects
删除指定的键值对
removeObjectForKey
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Jack",@"Name",
@"18",@"Age",
@"Male",@"Gender",
nil];
// [dict setObject:@"Chinese" forKey:@"National"];
[dict removeObjectForKey:@"Gender"];
NSLog(@"%@",dict);
/**
{
Age = 18;
Gender = Male;
}
*/
(48)NSFileManager
用来操作磁盘上的文件 文件夹 对他们进行创建、删除、复制 拷贝 移动.....
(49)常用结构体
CGPoint、NSPoint
1、定义1个结构体来表示控件在界面上得坐标。
typedef struct
{
int x;
int y;
}CZPoint;
CZPoint p1 = {20,30};
以及Foundation定义的CGPoint、NSPoint;( CGPoint与NSPoint都是同1个结构体,只不过定义两个名字.)
---------声明CGPoint变量并初始化的方式-------
// method 1
CGPoint p1;
p1.x = 20;
p1.y = 30;
//method2
CGPoint p1 = {20,30};
//method3
CGPoint p1 = {.x = 20, .y = 30};
Foundation框架中提供了函数来快速的创建1个CGPoint变量:
CGPointMake(x,y)
CGPoint p1 = CGPointMake(20, 30);
NSMakePoint(x,y)
NSPoint p2 = NSMakePoint(20, 30);
CGSize、NSSize
2、声明1个变量来保存某个控件的大小.
typedef struct
{
double width;
double height;
}CZSize;
CZSize size = {50,20};
Foundation框架中已经定义好了1个结构体叫做CGSize、NSSize;( NSSize和CGSize是同1个结构体,只不过定义了两个名称.)
CGSize结构体一般情况下用来表示控件的大小.
------CGSize声明并初始化的方式----------
// method1
CGSize size;
size.width = 100;
size.height = 30;
// method2
CGSize size = {100,30};
//method3
CGSize size = {.width = 100, .height = 30};
Foundation框架中提供的函数来快速的创建1个CGSize变量:
CGSizeMake(width,height)
CGSize size0 = CGSizeMake(100, 30);
NSMakeSize(width,height)
NSSize size1 = NSSize(100, 30)
CGRect、NSRect
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
这个Foundation提供的结构体在一般情况下存储了1个控件的位置和大小
----CGRect的声明和初始化-----
CGRect rect;
rect.origin.x = 20;
rect.origin.y = 40;
rect.size.width = 100;
rect.size.height = 30;
提供了函数用来快速创建CGRect变量
CGRect rect = CGRectMake(10, 20, 100, 30);
CGRect rect1 = NSMakeRect(10, 20, 100, 30);
使用时建议使用CG
(50)NSValue
之前学的结构体:NSRange、CGPoint、CGSize、CGRect等都无法直接存储到集合中,如果要存储到集合中,则需要先存到OC对象中,再存入集合;NSValue就是专门用来包装结构体变量的;
CGPoint point = CGPointMake(80,30);
CGSize size = CGSizeMake(600,300);
CGRect rect = CGRectMake(80, 30, 600, 300);
NSValue *ocPoint = [NSValue valueWithPoint:point];
NSLog(@"Point---%@",NSStringFromPoint(ocPoint.pointValue));
NSValue *ocSize = [NSValue valueWithSize:size];
NSLog(@"Size---%@",NSStringFromSize(ocSize.sizeValue));
NSValue *ocRect = [NSValue valueWithRect:rect];
NSLog(@"Rect---%@",NSStringFromRect(ocRect.rectValue));
NSArray *arr = @[ocPoint,ocSize,ocRect];
NSLog(@"Arr:%@",arr);
(51)NSDate
获取当前时间
// 默认格式 年-月-日 时:分:秒 +时区.
NSDate *date = [NSDate date];
NSLog(@"%@",date); //获取当前系统时间
NSDate中存储的是格林威治时间,当直接打印时,会默认使用系统时区;但当NSLog中包含中文的话,会触发系统的本地化设置,导致时区转换出现偏差;
指定格式输出
1、要先建一个NSDateFormatter对象:NSDateFormatter *formatData = [NSDateFormatter new];
2、调用NSDateFormatter的dataFormat设置日期格式:formatData.dateFormat = @"yyyy年MM月dd日 HH点mm分ss秒";
3、调用NSDateFormatter的stringFromDate对传入的时间进行格式化;
NSDate *date = [NSDate new];
NSDateFormatter *formatData = [NSDateFormatter new];
formatData.dateFormat = @"yyyy年MM月dd日 HH点mm分ss秒";
NSLog(@"格式化的时间:%@",[formatData stringFromDate:date]);
为dateFormat设置不同的时间格式,可以取出时间的各个元素
@"yyyy":年
@"MM":月
@"dd":日
@"HH":时
@"mm":分
@"ss":秒
//取出时间里的各个元素。
NSDate *date = [NSDate new];
NSDateFormatter * formatter = [NSDateFormatter new];
formatter.dateFormat = @"yyyy";
NSString * year = [formatter stringFromDate:date];
NSLog(@"%@年",year);
formatter.dateFormat = @"MM";
NSString * month = [formatter stringFromDate:date];
NSLog(@"%@月",month);
formatter.dateFormat = @"dd";
NSString * day = [formatter stringFromDate:date];
NSLog(@"%@日",day);
formatter.dateFormat = @"HH";
NSString * hours = [formatter stringFromDate:date];
NSLog(@"%@时",hours);
formatter.dateFormat = @"mm";
NSString * mins = [formatter stringFromDate:date];
NSLog(@"%@分",mins);
formatter.dateFormat = @"ss";
NSString * secs = [formatter stringFromDate:date];
NSLog(@"%@秒",secs);
计算时间
想要得到明天此时此刻的时间:dateWithTimeIntervalSinceNow
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:8*60*60];
NSLog(@"%@",date);
传入1个负数,就是在当前时间的基础之上减指定的秒数。