RE0_OC_4

187 阅读11分钟

(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个负数,就是在当前时间的基础之上减指定的秒数。