1、数组字典
2、协议 拷贝 归档
3、类目 继承 延展
4、代理
5、block
6、通知 KVC KVO
7、方法 setter getter
8、日期类
9、sqlite
10、uiview 图层关系
11、label imageview uiview动画
12、uicontrol:button selider segment
13、uicontrol:textfield uiswitch
14、弹出框 等待视图
15、手势
16、滚动视图:scrollview
17、tableview
18、textview
19、webview
20、导航控制器 分栏控制器
21、MVC
22、bmob
协议:制定一个共同遵守的条约 可以不遵守协议 如果遵守了->也可以不去落实
Protocol:协议 制定共同实现的方法 (如果不实现会警告 但不会崩溃)
定义一个协议:
1、协议只有声明文件 只需要告诉人 要遵守什么方法 并不需要指定 具体怎么去实现
2、协议有强制执行(required)和选择执行(optional) 默认的是强制执行
声明协议的步骤:
1、创建声明协议 command+n ->Objective-c file
->选择protocol
@protocol 协议名 <NSObject>
@end
2、声明协议的方法(只要遵守协议的类 都可以使用这个接口)
声明协议的方法有两种 权限
(1)强制执行@required 默认的
(2)选择执行@optional
3、遵守协议实现协议的步骤:
1、导入协议的名字 #import "协议名".h
2、@interface 类名:父类名 <协议的名字>
3、实现协议里面的方法
#import <Foundation/Foundation.h>
//公式:@protocol 协议名 <NSObject>
@protocol RGLight <NSObject>
@required//默认的强制执行
- (void)redLight;
- (void)greenLight;
//强制执行的协议方法 遵守协议的类 如果没有实现 就会警告提示
@optional//选择执行
- (void)yellowLight;
//启动基本完成程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s %d",__FUNCTION__,__LINE__);
[self.window makeKeyAndVisible];
Button *button = [[Button alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
// 使用协议的方法
[button setViewColor:[UIColor redColor]];
[self.window addSubview:button];
View *view = [[View alloc] initWithFrame:CGRectMake(100, 200, 100, 100)];
// 使用协议的方法
[view setViewColor:[UIColor orangeColor]];
[self.window addSubview:view];
return YES;
}
//当应用程序将要入非活动状态执行
//进入非活动状态的条件
//1、来电话
//2、HOME键
拷贝:赋值一个对象会变成另外一个对象。
深拷贝:复制对象,并且复制对象里面的内容,完全拷贝。
浅拷贝:指针拷贝,只拷贝对象,不拷贝对象里面的内容。
copy
mutableCopy 系统自带的都属于浅拷贝
实现深拷贝的方法
1、可以自定义拷贝(根据具体拷贝内容的实现)
2、系统提供给了深拷贝的构造方法
(1)数组 -( instancetype)initWithArray:(NSArray<ObjectType>)array copyItems:(BOOL)flag
(2)字典 -( instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType>)otherDictionary copyItems:(BOOL)flag
自定义拷贝
1、copyWithZone:
2、mutableCopyWithZone
- (id)copyWithZone:(nullable NSZone *)zone{
// allocWithZone在执行copy的时候分配内存
// new是拷贝之后新的对象
UserInfoModel *new = [[UserInfoModel allocWithZone:zone] init];
new.list = [self.list copy];
new.info = [self.info copy];
return new;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone{
UserInfoModel *new = [[UserInfoModel allocWithZone:zone] init];
new.list = [self.list mutableCopy];
new.info = [self.info mutableCopy];
return new;
}
归档分为存储数据(编码的过程、或叫序列化的过程、或归档过程)。
读取数据(解码、反序列化、解归档)。
归档:NSCoding
除了NSObject未实现归档协议,其他实现了协议的类都可以归档(UIView、UIViewController、UIImage...)
归档的类名:NSKeyedArchiver
解归档类名:NSKeyedUnarchiver
// 归档的步骤
//1、写归档存储文件的路径
//2、准备要归档的数据
//3、开始归档
//1、写归档存储文件的路径
NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
// 归档文件的尾缀尽量.archiver
NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
//2、准备要归档的数据
NSArray *list = @[@{@"name":@"奈何",@"age":@180,@"height":@180}];
//3、开始归档
// + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
// 把一个支持object(支持归档)类型的数据,以归档的形式存储到指定位置
// 支持归档协议的对象,系统帮忙对他进行了编码
BOOL isSuccess = [NSKeyedArchiver archiveRootObject:list toFile:path];
if (isSuccess) {
NSLog(@"%@",path);
}
解归档的步骤
// 1、归档文件的路径
// 2、开始解归档
// 1、归档文件的路径
NSArray *serchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
// 归档文件的尾缀尽量.archiver
NSString *path = [[serchList lastObject] stringByAppendingPathComponent:@"list.archiver"];
// 2、开始解归档
NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@",list);
// NSDictionary *dic = @{@"name":@"..."};归档到字典
归档多种数据
1、存储路径
2、初始化一个可变的二进制对象,同时准备要归档的数据
3、归档等待写入数据的二进制对象(要使用归档的数据,对需要的归档的数据进行编码)
4、使用归档对象,对要归档的数据进行编码(编码结束后同时写入到二进制对象)
5、编码结束(把编码后的数据写入到二进制数据《系统操作》现在二进制对象里面已经存在编码之后的数据
)
6、把二进制对象存储到指定位置(归档成功)
1、存储路径
NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[searchList lastObject] stringByAppendingPathComponent:@"user. archiver"];
// 2、 初始化一个可变的二进制对象,同时准备要归档的数据
// 准备要归档的数据
NSString *name = @"肖耐";
NSInteger age = 18;
float height = 180;
// 初始化一个可变的二进制对象
NSMutableData *data = [NSMutableData data];
// 3、归档等待写入数据的二进制对象
// - (instancetype)initForWritingWithMutableData:(NSMutableData *)data
// 二进制文件等待写入->让归档对象帮他写入(编码结束,就会把编码后的数据,写入到二进制对象)
NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 4、使用归档对象,对要归档的数据进行编码(同是写入到二进制对象)
// 编码使用encode,解码使用decode
// 要用对应的数据类型进行编码
[arc encodeObject:name forKey:@"name"];
[arc encodeInteger:age forKey:@"age"];
[arc encodeFloat:height forKey:@"height"];
// 5、编码结束。编码结束之后,会把编码之后的数据写入到二进制对象
[arc finishEncoding];
// 6、把二进制对象存储到指定位置(归档成功)
BOOL isSuccess = [data writeToFile:path atomically:YES];
if (isSuccess) {
NSLog(@"归档路径=%@",path);
}
多重数据存到同一个归档文件解归档
// 1、归档文件的路径
// 2、使用data 读取数据准备解归档data里面的数据
// 3、解归档数据,用对应的数据类型接收
- (instancetype)initForReadingWithData:(NSData *)data;
// NSData *readData = [[NSData dataWithContentsOfFile:path];
// 2、使用data 读取数据准备解归档data里面的数据
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:path]];
// 3、解归档数据,用对应的数据类型接收
NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSInteger age = [unarchiver decodeIntegerForKey:@"age"];
float height = [unarchiver decodeFloatForKey:@"height"];
-------------------------------
类目:category
对一个类《原有类》 方法的扩展
1.命名规则:类名+类目的名称(要扩展的哪一个方向)
2.?使用:
1).开发便利 可以不互相影响
2).扩展系统类里面的方法 ——-》oc是不开源的不能修改原有类的方法实现
3.调用 使用原有类去调用(类方法《原有类的类名调用》)(对象方法《原有类的对象调用》)
4.创建一个类目-》客忙得+恩---object-c file ----category----第一个输入内容:类目的名字 第二个输入的内容:要扩展的类
********类目只能添加方法,不允许添加变量
[UIImage imageNamed:@""]会把图片直接缓存到内存 占用运行时的内存(不超过30M)一般使用来添加图标
通过文件的路径去读取图片 不会直接加载到内存-》
[UIImage imageWithContentsOfFile:图片路径]
----------------------------------
延展:给类声明私有方法和变量 在。m文件里面添加一个私有的接口文件(@interface 类名()@end)
Extension 给类声明一个私有的方法和变量
类目:category
对一个类《原有类》 方法的扩展
1.命名规则:类名+类目的名称(要扩展的哪一个方向)
2.?使用:
1).开发便利 可以不互相影响
2).扩展系统类里面的方法 ——-》oc是不开源的不能修改原有类的方法实现
3.调用 使用原有类去调用(类方法《原有类的类名调用》)(对象方法《原有类的对象调用》)
4.创建一个类目-》客忙得+恩---object-c file ----category----第一个输入内容:类目的名字 第二个输入的内容:要扩展的类
********类目只能添加方法,不允许添加变量
[UIImage imageNamed:@""]会把图片直接缓存到内存 占用运行时的内存(不超过30M)一般使用来添加图标
通过文件的路径去读取图片 不会直接加载到内存-》
[UIImage imageWithContentsOfFile:图片路径]
----------------------------------
延展:给类声明私有方法和变量 在。m文件里面添加一个私有的接口文件(@interface 类名()@end)
Extension 给类声明一个私有的方法和变量
*/2、继承
子类 父类(超级类)
父类有的方法 子类可以用
父类有的属性 子类可以使用
父类所有公开的方法属性 子类可以使用
子类独有的方法属性 父类不能使用。
代理使用步骤:
前三步 是写在 给别人值(帮别人做事)第二个页面
1、声明代理方法
2、声明属性接口
3、确定什么时候触发代理
后三步 写在接收数据的那 第一个页面
4、导入类名 代理名
5、挂上代理 (*****是否能 调用代理方法)
6、实现代理方法
/*
block 代码块 闭包(一个封闭的区域) 与语言函数相同
block 具有反向传值的,回调的功能
回调:执行完之后返回再去执行
在回调的时候 给他一个值
他分为声明实现,和调用两部分
声明 声明一个block 会执行
实现 实现一个block 不调用 不执行
调用 调用block 返回去执行 实现部分
1.block的声明
2.分析回调,反向传值
3.当作变量使用
4.当作参数适用
5.当作属性使用 解决block 的内存循环引用
6.代替代理
block的公式
1。声明实现写到一块的公式
返回值类型(^block名字)(参数列表 参数类型 参数名)=^(参数列表){
<#实现代码#>
}
调用 block名字(参数)
2.声明实现分开的部分
(1)声明
返回值类型(^block)名字(参数列表);
(2)实现
block名字 =^(参数列表){
<#实现代码#>
}
(3)调用
block名字(参数)
block 代码块 闭包(一个封闭的区域) 与语言函数相同
block 具有反向传值的,回调的功能
回调:执行完之后返回再去执行
在回调的时候 给他一个值
他分为声明实现,和调用两部分
声明 声明一个block 会执行
实现 实现一个block 不调用 不执行
调用 调用block 返回去执行 实现部分
1.block的声明
2.分析回调,反向传值
3.当作变量使用
4.当作参数适用
5.当作属性使用 解决block 的内存循环引用
6.代替代理
block的公式
1。声明实现写到一块的公式
返回值类型(^block名字)(参数列表 参数类型 参数名)=^(参数列表){
<#实现代码#>
}
调用 block名字(参数)
2.声明实现分开的部分
(1)声明
返回值类型(^block)名字(参数列表);
(2)实现
block名字 =^(参数列表){
<#实现代码#>
}
(3)调用
block名字(参数)
---------
《未完待续》