OC 课程笔记总结13-Foundation 框架

课程:Foundation 

Foundation 不论是做 Mac开发和 IOS 开放中都是必不可少的,Foundation 框架中提供了很多常用的数据类型,比如结构体,枚举,类,包括NSObject,NSString等等类,如果没有这些类,是不能完成一个开发项目的。

Foundation:基础的意思。一般而言,一个类有一个自己对应的头文件,在 框架中有非常多的类,如果要一个类一个类的添加那就太痛苦了,所以,只需要包含一个框架的头文件就可以包含所有框架中的类了。

首先介绍的是 Foundation 中常用的结构体,结构体的知识点必须掌握,在 OC 中结构体使用得非常多。相关的用法一定要掌握,包括如何给结构体变量赋值,如何调用结构体,如何使用“.”来访问结构体内部的成员。其实类也相当于是一种特殊的结构体,不同的是类中有方法有数据,而结构体中只能有数据,不能包含方法。


Foundation 中常用的结构体有:


NSRange(location,length):

这个结构体是用来表示范围的。找出在一个字符串中的某个特定的字符串的启示位置和长度。在字符串中,空格也算一个字符。 使用这个结构体有多种方式,在开发中常用的方式是使用一个自带的函数 NSMakeRange(location length),格式如下: NSRange  a =  NSMakeRange (location length);

在 NSString 中,有一个 rangeOfString 方法,同样可以返回一个字符串的起始下标和长度,并且返回值的类型是 NSUInteger == unsigned long(是一个无符号整数,使用%ld 接收),当某个字符串查找不到时,会返回一个 NSNotFound,这个值转为ld 就是=-1;length=0。使用 NSString 的 rangeOfString 方法可以给 NSRange 进行赋值。


NSPoint \ CGPoint ( 这两个是同义词,在开发中多数使用 CGPoint,CG == CoreGraphics ,表示一个框架名称的缩写,要使用 CGXXX 这个结构体和方法,就必须包含这个框架,这个框架是跨平台框架,MAC 和 ios 都可以使用。)

NSPoint = CGPoint ,而 point 的意思是一个点,这个点是二维的点,所以这个结构体中包含有两个 double 类型的数据:x,y。用x 和 y 来表示一个点的坐标,对应手机的屏幕坐标。而CG 和 NS 的不同在于 CG 是跨平台的,所以开放中都是用 CGPoint。

同样的,对于结构体的赋值也有一个对应的函数 NSMakePoint(x,y),在开发中使用 CGPoint,对应的赋值函数是 CGPointMake(x,y),实际开发中使用这个函数。对于 坐标是(0,0)而言,这个点是一个特殊的点,表示坐标原点,开发中野经常使用,

并且还有一个对应的特别的结构体 CGPointZero ==CGPointMake (0,0); 通常使用 CGPointZero 表示原点。原点在手机屏幕上的左上角,往下和往右依次增加 x和y 的值。


NSSize \ CGSize (开发中常用 CGSize)

这个结构体中包含的两个数据是 double 类型的 width 和 height,宽和高。用于表示一个 UI 元素所占屏幕的尺寸。同样的也有两个赋值函数 NSMakeSize 和 CGSizeMake(开发使用)。同样的也有 CGSizeZero。


NSRect \ CGRect (开发常用)。

在 NSRect 结构体中包含的数据是 NSPoint 和 NSSize,在 CGRect 中包含的是 CGOrigin(Origin :起源,其实就是 CGPoint) 和 CGSize,同样,开发中还是使用 CGRect。这个结构体用于表示一个 UI 元素的位置和尺寸,用于描述 UI 元素。每一个 UI元素都有一个 CGRect 属性。对于 UI 元素,这个属性中的x,y 表示的是左上角的坐标,从左上角开始算 width 和 height。对于这个结构体,赋值函数为 CGRectMake(x,y,width,height)。对于结构体赋值而言是允许嵌套的。同样也有 CGRectZero。


在结构体的方法中,有很多方法都是类似的,根据方法名可以直接推测出作用,并且对于不同的结构体同样工 功能的方法只是方法名不同而已,例如 CGXXXMake,CGXXXZero,(BOOL)CGXXXEqualToXXX(判断 xxx 是否和 xxx 相等),还有一个就是

(BOOL)CGXXXContainsXXX(判断 xxx 是否包含 xxx),使用这个方法可以判断手机屏幕中的某个点是否在 UI 元素范围内,即点击某个点的话是否会触发功能,等等方法。


如果想要输出打印某个结构体的所有信息,如果按照平常方法的话会非常麻烦,在实际中的做法是先把结构体转换为一个字符串,这样就只需要一个%s 接收符就可以把整个结构体的信息打印输出了。要想把结构体转为 字符串,只要是 NSString 的方法就可以了,方法名为 NSStringFromXXX,其中 XXX 对应结构体了名称(去掉 NS 或者 CG 剩下的名称),记住在 OC 中字符串也是一个对象,要接收一个对象只能用指针。转换为字符串之后就可以按照顺序打印输出结构体的具体信息。




Foundation 中常用的类:

常用的类有  :NSString , NSArray , NSSet  , NSDictionary ,NSDate  ,NSObject  等等,以上的类是开发中最常用的类。

NSString 中还有一个常用的子类 :NSMutableString :Mutable:可变的意思。即这个类表示一个可变的字符串对象。同样的,在 NSArray 中也有这么一个子类:NSMutableArray,可变的数组。同理 Set 也有一个 NSMutableSet 子类,所以可以推测出有不少子类都是 NSMutableXXXX,在实际使用中可以根据Xcode 的提示来看看是否有这么一个 XXX 的 子类。

NSString 常用的方法:initWithFormat,使用这个方法可以生成一个带有接收数值的的 字符串,如:【initWithFormat  @”this a method %d”,a】,可以把变量 a 的值传入字符串后再输出。

initWithUTF8String :这个方法可以把 C 的字符串转为 OC 的字符串。也可以把 OC 字符串转为 C 字符串:UTF8String,这个方法的返回类型是 const char *,其中 const 表示常量的意思,NSString 中还有读取文件的方法,

Foundation 中有这么一个类 NSURL,可以创建 URL 对象,URL 即统一资源定位符,URL 的格式是:协议头 :// 路径(其中的//是一定要写,不能省略的,是固定格式,所以有时候出现///三斜线)。不同资源有不同的协议头,网络资源协议头为 HTTP,本地文件资源协议头为 file,ftp 服务器资源的文件头是 ftp,URL 可以获取一切资源。

在实际开发中,更常用的字符串创建方法是直接使用 stringWithFormat 方法,而不用再使用 alloc 后使用 initWithXXXX 这样的格式。所以在实际开发中使用的方法都是 stringWithXXXXXX。或者是 URLWithXXXXX,什么类的方法就以什么类开头,然后 WithXXX,一般 都有相关的方法相对应的,同时也表明了定义方法名的规范,什么类的方法就以什么类名开头。系统本身自带的方法非常丰富,非常多,需要不断学习。


NSSTring 中的子类,可变字符串类:NSMutableString。可变字符串表示可以改变字符串的内容,即同一个内存地址的字符串内容是可以改变的,而普通的 字符串内容是不可变的,一个字符串一旦确定,这个地址中对应的字符串就确定了,如果要改变字符串的内容就需要重新分配地址给新的字符串。对于可变字符串类,还有很多的方法来对字符串进行处理。要记住的是,如果对于不可变字符串进行操作,那么原来的字符串实际是没有改变的,只不过是产生了一个新的字符串而已。


Foundation 中的集合类:

NSArray,NSSet,NSDictionary 这三个类称为 OC 中的集合类。集合类就是多个对象集中在一起的意思,不同的是集合的方式。在 c 中,数组只能存放相同类型的数据,在 OC 中,数组也是一种对象,并且 OC 数组可以任何类型的对象,但是不能存放基本数据类型的数据,如果需要存放基本数据类型的数据,需要使用 ????????? 的数组,存放对象,用 oc 的数组。只要是数组,存放的元素都是有顺序的,NSArray 是不可变数组,同样的,也有可变的数组,和字符串一样。和 c 的数组一样,oc 的数组也必须有自己的结束表示,在 c 中用\0表示结束,对于多元素的 OC 数组,要使用 nil 表示结束,并且这个 nil 必须手动添加到数组中,系统不会自动添加。并且 oc 数组的元素不能是 nil,只要发现了 nil,就说明这个数组结束了,即 oc 数组中 nil 是不会被当成元素的,只有oc 对象才能是数组的元素。

对于不可变数组,数组中的元素是不可变,如果数组改变了,那也是重新生成了一个新的数组。NSArray 的方法中,要注意区分方法名是否以“s”结尾,如果没有 s 结尾,这很可能这个方法是只对单个元素起作用,如果是以“s”结尾,说明这个方法很可能是对多个元素作用的。访问 OC 数组的元素有两种方式:一种是使用方法来访问对应数组下标的元素,还有一种是利用 xcode 的特性来简化对数组元素的访问,xcode 简化了访问 OC 数组的方式,可以和访问 c 数组的方式一样,数组名【下标】,编译后,xcode 会自动转换代码。实际中通常使用后一种方法,同样的,在定义 oc 数组也可以利用 xcode 自动转换代码的特性(就像点“.”语法,本质是编译器转换代码,而不是真的有这么一种方法)来定义数组,和 定义 c 数组不同的是,需要在括号前加上@标识符。例如:NSArray *array = @[“sffaf”,"adfafafaf","opioi"......] ;这样就可以定义一个 OC 的对象数组了,其中的元素都是字符串对象。array。count 方法可以取得数组元素的个数,就像。length 方法一样

快速遍历数组的方法:for(id obj in 数组名),其中,obj 表示接收元素的临时变量,类似于 java 中的方法 ,接收对象使用%@来接收。通常结合 block 来快速遍历数组,这样效率更高。


NSMutableArray:可变数组。

不可变数组就定义了一个数组对象之后,这个数组的元素个数就不能够在改变了,但是元素内容还是可以改变的。对于可变数组则是数组的元素个数是可以改变的,可增加,可减少。通过调用方法来对数组元素进行增减。要注意在可变数组中快速创建数组的方法是和不可变数组不同的,在不可变数组中可以使用@[]来快速创建数组,但是这个方法不能用在可变数组中。


NSSet:

这个集合和数组的最大区别是 NSSet 中的元素是没有顺序的,数组中每个元素都有自己的顺序。同样,在 NSSet 中只能放OC对象类型的数据,不能放基本数据,结构体,枚举等非对象类型数据,并且也以 nil 作为结束的标记。因为 set 元素是没有顺序的,那么取出 set 中的元素要么是指定的元素,要么是随机取出的元素。NSSet 是没有快速创建的。


NSDictionary:

这个类是对实际生活中使用字典行为的映射,NSDictionary 也是一个集合,也可以存放多个元素,同样是只能放对象元素。类似于 java 中的 map。根据索引找到具体的内容,索引又称为 key,内容称为 value,在 NSDicitonary 中都是以键值对的形式存放对象的。同样NSDictionary 也是不可变的,快速创建多键值对字典可以通过将两个数组当成参数传递给创建字典对象的方法。在新版的 xcode 中同样也有快速创建字典的特性,可以通过@{。。。}来快速建立多对键值对,实际开发中通常是哟功能这个方法,通过冒号来表示一对键值对,通过逗号来区分不同的键值对,同样的通过key 来取出 value 也有快速方法。字典也有返回对象个数的方法,但是返回的不是总对象的个数,而是返回键值对的对数。并且字典集合也是没有顺序的,只有一个集合有顺序,就是数组。字典是根据 key 值来取得 value 值的,如果定义了重复的 key 值,那么以最后定义的 key 值为准,可以定义多个相同的 value 值,只要对应的 key 值不同即可,即key 值是唯一的。

可变字典:

同样注意的是创建可变字典时也是不能用@{。。。}的方法来快速创建,和可变数组一样,

字典的遍历:

取出字典中的键值对也是随机的,因为字典中的元素是没有顺序的。同样也有快速遍历的方法,就是利用 block,类似于数组中的方法。


集合总结:

OC 中集合和 java 中集合的类比:

oc java
NSArray List
NSSet Set
NSDictionary Map


oc 中的集合如下:

1.NSArray \ NSMutableArray

* 有序的

* 快速创建 @[ ];

* 快速访问元素:数组名[i];

* 快速打印:NSLog (@“%@”,数组名);

2.NSSet \ NSMutableSet

* 无序的

* 没有快速访问方法,不常用

3.NSDictionary \ NSMutableDictionary

* 无序

* 快速创建:@{ key1 : value , key2 : value2 , .................};

* 快速访问:字典名[key]

* 快速打印:NSLog (@“%@”,key);



以上所有的快速创建方法都只能是不可变的。


oc 中的通讯录可以用字典数组来设计,通讯录是有顺序的。


NSNumber和 NSValue:

如果需要把基本数据类型转换为对象,可以通过NSNumber 这个类来进行。这个类可以将多种基本数据类型转换为oc 的对象类型。要记住接收对象的只能是用指针。同时这个类还提供了一个将对象转变为基本数据类型的方法:[对象名 数据类型名 value]。

字符串对象也有类似的方法,可以将基本数据类型转为字符串对象:[NSString stringWithFormat: @"%@",字符串对象名];也可以将字符串对象转为基本数据类型:[字符串名 数据类型名 value ];快速转为 NSNumber 对象的方法是:@数值。同样也是编译器特性。

@YES,也可以把 bool 类型转为对象,字符类型也可以转为对象,任何基本数据类型都可以转为对象,但是要注意字符使用单引号,而使用双引号的话就表示是一个字符串,如果不使用单引号或者双引号,直接@字符串,那么系统会认为这是一个关键字,这个也要注意。还可以将基本数据类型 变量转变为对象,方法是:@(基本数据变量名);小括号也有取值的作用。


NSValue:

NSNumber 之所以能够将基本数据类型转换为对象就是因为继承了 NSValue 这个类,与 NSNumber 只能转换基本数据类型不同,NSValue 可以将任何类型转换为对象,包括结构体,枚举类型,基本数据类型,指针,等等都可以转换对象类型。利用这个类可以把结构体存入 oc 数组中,这个类经常使用在动画制作中,因为制作动画需要使用很多个结构体。所以这个类是非常有用的。


NSDate:

新创建时间对象,那么这个对象就是当前的时间,但是时间是以格林威治时间为准的,并不是北京时间。在 oc 中的时间单位是秒,这类中有很多有关时间的方法,比如求时间间隔的方法。

日期格式化:想要把一个时间输出显示,就必须先把NSDate 转换为一个字符串类,表示时间的格式有很多种,首先确定显示时间的格式。转换的方法为 stringFromDate.但在转换之前记得首先确定时间显示格式,例如 yyyy-MM-dd HH:mm:ss,表示年月日,时分秒。

同时也可以将字符串转为一个 NSDate 类对象。



Foundation中还有非常多的类和方法,需要不断的进行更新学习。



























































你可能感兴趣的:(OC 课程笔记总结13-Foundation 框架)