IOS基础
http://www.cocoachina.com
https://gsl201600.github.io/page/8/
一·类的成员变量和属性
Swift学习文档
1.成员属性
1.特点:成员属性是公共的用于暴露给其他的类访问,因为类会帮它自动创建get,set方法。
2.成员属性放在.h文件内,使用方法如下:
//声明
@property(nonatomic,strong)NSString *name;
//nonatomic允许多线程同时访问,但是不能保证线程安全,性能高
//atomic不允许多线程同时访问,但是能保证线程安全,性能低
//strong是强引用,
//copy
//weak
//assign//如引用,用于修饰基本类型
3.案例展示
2.成员变量
1.特点:成员变量是私有的其他类不能访问,只有通过get和set方法才可以对成员属性进行操作。
2.成员属性放在.m文件内,使用方法如下
//声明
@interface 类名()
{
NSString *name;//成员变量
}
//set和get方法
-(void)setName:(NSString *)name{
this.name=name;
}
-(NSString *)name{
return name;
}
3.案例展示
二·类的成员方法(函数)
1.类的成员方法
1.使用
①无参数,无返回值方法
1.需要在.h文件声明
-(void)functionName;
案例
3.在.m文件内实现
-(void)functionName{
}
案例
②有参数,无返回值方法
1.声明
-(void)functionName:(参数数据类型)参数名;
案例
3.实现
-(void)functionName:(参数类型)参数名{
}
案例
③无参数,有返回值
1.声明
-(NSString)function;
2.实现
-(NSString)function{
}
案例
④.类方法的调用
类的声明
Persion *persion=[[Persion alloc]init];
调用方法
[persion functionName]
案例
⑤构造方法
1.功能
构造函数主要用于初始化操作,在类被创建的时候被调用
2.构造函数的使用
-(instancetype)init
{
self=[super init];
if(self)
{
NSLog(@"我是构造函数");
}
}
案例
⑥析构方法
1.功能
主要用于类使用完之后的空间释放(现在已经不需要手动去释放空间了),在类被释放掉的时候调用析构函数
2.使用
-(void)dealloc{
}
案例
⑦实例方法和类的方法
1.实例方法介绍
实例方法是类被实例化后实例调用的方法
2.声明
-(void)function;
案例
3.类的方法介绍
类的方法是直接用类名调用的方法,不需要实例化(和JAVA静态方法有点相似)
4.声明
+(void)function;
案例
5.实现
+(void)function{
}
三·类的关键字
1.self关键字
①self关键字的介绍
self代表的是调用者,在方法内部代表的是当前方法的实例。
②使用
[self 本类的方法];
案例
2.继承
①继承的介绍
只要一个类继承了父类,他就拥有了成员暴露出来的所有成员变量和方法
②.使用
在.h文件继承
@interface 本类:父类
案例
2.super关键字
①super关键字的介绍
super是编译器指示符,仅仅是一个标志,并不是一个指针,是标志的当前对象去调用父类的方法,本质上还是当前对象调用,并不是让父类对像调用方法,调用者还是本身。
②使用
[super fuctionName]//调用父类方法
super.name //获得父类属性
案例
四·字符串
1.字符串的截取
①从头开始截取
NSString *str=@"HeadCenterEnd";
//重从头部截取4个字符
NSString *tempStr=[str substringToIndex:4];
//tempStr=Head
②从尾截取
NSString *str=@"HeadCenterEnd";
//重从尾部截取3个字符
NSString *tempStr=[str substringFromIndex:str.length-3];
//tempStr=End
③截取中间的一个区域的字符
NSString *str=@"HeadCenterEnd";
//创建一个区域对象
NSRange range;
range.location=4;//开始索引
range.length=6;//截取的长度
//重从尾部截取3个字符
NSString *tempStr=[str substringWithRange:range];
//tempStr=Center
2.字符串的替换
//①替换某一段字符
NSString *str=@"HeadCenterEnd";
NSRange range=NSMakeRange(4,6);//区域对象
NSString *tempStr=[str stringByReplacingCharactersInRange:range withString@"Middle"];
tempStr=@"HeadMiddleEnd";
//②替换字符串中的字符
NSString *str=@"AADDCC";
NSString *tempStr=[str stringByReplacingOccurrencesOfString:@"DD" withString@"BB"];
tempStr=@"AABBCC";
3.分割字符串
NSString *str=@"name:xiaoming;age:11;height:170";
NSArray *tempArray=[str componentsSeparatedByString:@";"];
//输出结果
name:xiaoming,
age:11,
height:170
4.字符串的拼接
NSString *age=@"年龄";
int mun=15;//基本类型不需要*
NSString *temp=[NSString stringWithFormat:@"%@:%d",age,mun];//引用类型用@占位符
//输出结果
年龄:15
五·数据类型
1.数据类型
int 1,2,3
char 'a','b','c'
array {1,2,3}
NSString 字符串引用类型
NSInteger int
CGFloat float
NSRange 范围
NSNumber 对象引用类型
字典
Bool YES or NO
2.NSInteger
NSInteger a;
a=1;
NSInteger b=2;
3.CGFloat
CGFloat b;
b=2.3;
CGFloat a=1.3;
4.NSNumber
//int
int a=2;
NSNumber *number=[NSNumber numberWithInteger :10];
a+=number.integerValue;
//float
NSNumber *number=[NSNumber numberWithFloat:1.6];
int c=0.4+number.floatValue;
5.NSArray
①不可变数组
NSArray *array=[[NSArray alloc]initWithObjects:@"a",@"b",@"c",nil];//创建并赋值
NSArray *array2=[[NSArray alloc]initWithArray:array];//创建并赋一个数组
NSArray *array3=[NSArray arrayWithArray:array];//使用类方法创建并赋值;
NSArray *array4=[NSArray array];//使用类方法
②可变数组
NSMutableArray *marray=[[NSMutableArray alloc]init];//使用构造方法创建
NSMutableArray *marray2=[NSMutableArray arrayWithCapacity:100]//创建并设置大小
NSMutableArray *marray3=[NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];//创建并初始化值
NSMutableArray *marray4=[NSMutableArray alloc]initWithArray:array];//创建并赋值一个不可变数组
③操作可变数组
NSArray *array=[[NSArray alloc]initWithObjects:@"a",@"b",@"c",nil];//创建并赋值
NSMutableArray *marray=[[NSMutableArray alloc]init];//使用构造方法创建
//添加一个对象
[marray addObject:<对象>];
//添加一个不可变数组
[marray addObjectsFromArray:array];
//删除指定对象
[marray removeObject:@"a"];
//删除最后一个对象
[marray removeLastObject];
//根据索引删除指定对象
[marray removeObjectAtIndex:0];
//删除所有对象
[marray removeAllObjects];
6.字典
①不可变字典
NSDictionary *dic=[[NSDictionary alloc]init];//构造方法创建
NSDictionary *dic=[NSDictionary dictionaryWithObject:@"value" forKey:@"key"];//类方法创建只有一对键值对的字典
NSDictionary *dic=@{
@"name":@"xiaoming",
@"age":@"15"
}//声明字典赋值
NSDictionary *dic=[NSDictionary dictionaryWithDictionary:dic];//类方法创建并赋值一个不可变字典
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"name",@"xiaoming",@"age",@"11",nil];//类方法创建并赋值
②可变字典
NSMutableDictionary *mdic=[[NSMutableDictionary alloc]init];//构造方法创建
NSMutableDictionary *mdic=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"name",@"xiaoming",@"age",@"11",nil];//类方法创建并赋值
NSMutableDictionary *mdic=[NSMutableDictionary dictionaryWithDictionary:mdic];
③可变数组的操作
NSMutableDictionary *mdic=[[NSMutableDictionary alloc]init];
//添加
[dic setObject:@“xiaoming” forKey:@“name”];
//修改
[dic setObject:@“xiaofang” forKey:@“name”];
//删除指定
[dic removeObjectForKey:@“name”];
//删除所有
[dic removeAllObjects];
//获得所有Key
NSArray *keyArray= [dic allKeys];
//遍历
for(id key in dic)
{
NSLong(@“key:%@ value:%@”,key,[dic objectForKey]);
}
六·内存管理
1.ARC(自动管理内存)
现在使用的是ARC自动内存管理,不需要我们管理内存。
2.MRC(手动管理内存)
①管理过程:
核心:谁创建谁释放,用计数器判断。
当我们调用alloc/new/copy/mutablecopy/retrain 会导致计数器加1(每加1就要占内存)。
要通过release方法释放内存([object release]);
②原则
自己生产的对象,自己持有。
非自己产生的对象,自己也能持有。
不在需要自己持有对象的时候,释放。
非自己持有的对象无需释放
六·Objective-c的语言特性
1.类目(类别)
①类目的介绍
类别(category)是Objective-C语言的新特性,为现在的类添加新方法的方式。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现,用类目就可以实现在没有类的源代码的条件下为类添加新的方法。
通过类目加入的方法会成为原始类的部分。列如:通过类目为NSString添加方法,编译会把这些方法加入NSString的定义里;类目里定义的方法可以干任何原始类中方法能干的事,在运行时他们是平等对待的;类目里定义的方法也会被原始类的子类所继承,就跟原始类的其他方法一样。
②类目的局限性
a,无法添加新的实例变量。
b,若在类目中覆盖现有类的原有方法。这样会引起super消息的断裂,因为类目中的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法
③使用类目
a.创建
b.生成的类
c.添加方法的声明
d.添加方法的实现
e.使用
2.延展
①简介
延展Extension,是为类扩充私有的方法,以及私有的实例变量,和分类Category相比,延展定义的方法是有私有的,而且还可以定义实例变量(私有的)。
②使用
以@interface开头+类名(哪一个类的延展)+小括号,小括号内填写的是延展名,一般情况下都省略。@end结束(写在.m文件里);
③案例
3.协议(相当于Java里面的interface)
①简介
Protocol(协议)用来声明一些方法,或者说,Protocol是由一系列的方法声明组成的。一个类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明。
一个Protocol只要遵守了其他Protocol,就相当于拥有了其他Protocol的所有方法声明。
既然Protocol只能声明方法,那么方法的实现自然写在类的实现文档.m里面。
②使用
@required
-(void)xxx;
@optional
-(void)xxxx;
@required之下的方法是必须实现的,不然编译器会发出报错;
@optional之下的方法是可选实现的。
③案例
a.创建Protocol
创建后会生成.h文件
b.声明方法
c.遵守协议
d.实现方法
4.KVO(key-value-observer)
①简介
KVO:当某个属性的值发生变化的时候,通知观察这,也就是说,当某一个对象的属性调用setter方法的时候,通知观察者,所以,KVO本质上其实是一个观察者模式。
②使用
a.成员声明属性
b.创建实例
c.对实例属性进行监控
c.实现代理
4.KVC(key-value-coding)
①简介
KVC:是一个基于NSKeyValueCoding非正式协议实现的机制,他可以直接通过key值对对象的属性进行存储操作,而且不需要通过调用明确的存取方法。这样就可以在运行时动态在访问和修改对象,而不是在编译时确定。
KVC提供了一种间接访问属性方法成员变量的机制,可以通过字符串来访问对象的属性方法或成员变量。
②使用
a.在.h文件里面声明成员属性
b.声明对象
c.对属性进行赋值
d.获得值
c.多级赋值
d.多级获得值
5.单例
①简介
简单的来说,一个单例类,在整个过程中只有一个实例,并且提供一个类方法共全局调用,在编译时初始这个类,然后一直保存在内存中,直到退出时由系统自动释放这部分内存。
②使用
a.第一步(必不可少的)
+ (instancetype)sharedSingleton {
static Singleton *_sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//不能再使用alloc方法
//因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
_sharedSingleton = [[super allocWithZone:NULL] init];
});
return _sharedSingleton;
}
b.第二步
防止alloc] init] 和new引起的错误,因为alloc] init] 和 new 实际是一样的工作原理.都是执行了下面方法
// 防止外部调用alloc 或者 new
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [Singleton sharedSingleton];
}
c.第三步
防止copy引起的错误,个人感觉当你的单例类不遵循NSCopying协议,外部调用本身就会出错. 如果不是业务需求不遵循协议,该方法也可以不写
// 防止外部调用copy
- (id)copyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}
d.第四步
防止mutableCopy引起的错误,个人感觉当你的单例类不遵循NSMutableCopying协议,外部调用本身就会出错. 如果不是业务需求不遵循协议,该方法也可以不写
// 防止外部调用mutableCopy
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}
6.通知
①创建通知
②注册通知
③实现通知方法
7.目标动作回调
目标就是接受事件的对象
动作:事件反馈所要触发的方法
8.回调-委托模式
①使用方法
a.创建一个协议
b.创建一个Clock对象来当做Person对象的代理
1.Clock对象继承协议并实现协议
2.创建Person类同样继承协议并且声明代理成员属性
3.初始化Person和Clock并且将Clock赋值给代理成员属性,然后代理属性就能使用了
9.Block
①简介
代码块Block是苹果在IOS4开始引入的对C语言的拓展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量,作为参数,作为返回值Block被广泛运用。
注:block的声名与赋值只是保存了一段代码块,必须调用才能执行内部代码。
②使用()
a.首先在目标对象声明一个Block
b.在回调对象中实现Block代码块
c.在目标对象中调用Block代码块
③把block当做参数
a.声明函数
1.第一种
2.第二种
b.block代码块实现
c.将方法赋值给block
注意:循环引用(会造成内存泄漏)
a.将block转为弱引用
b.block赋值
七·UI控件
1.页面生命周期
①页面初始化
②页面将要出现
③页面已经出现
④页面将要消失
⑤页面已经消失
⑤页面释放
⑤页面单机事件
2.UILable
3.UIButton
4.UIView
5.UITextFiled
代理方法
6.UIImage
7.UITableView
①声明UITableView成员属性
②初始化UITableView
④注册Cell
⑤实现代理
⑥tableView系统左滑删除左滑动置顶链接
8.UICollectionView
①声明UICollectionView
②初始化UICollectionViewFlowLayout
③初始化UICollectionView
④注册UICollectionCell
⑤代理
9.WKWebView
WKWebView完整版
①声明WKWebView
②初始化WKWebView
③设置Url
④代理方法
完整篇https://www.jianshu.com/p/5cf0d241ae12
10.UIalertController
八,ViewController
1.UINavigationController
①设置UINavigationController的根视图
②设置子页面
③UIBarButtonItem
2.TabBarController
①大致框架
②设置字体颜色
③设置原图片颜色
④设置TabBar背景不透明
3.跳转
①push和present区别
a.push与present都可以推出新界面。
b.present与dismiss对应,push和pop对应。
c.present只能逐级返回,push所有视图由视图栈控制,返回上一级,也可以返回到根vc,其他vc。
present一般用于不同业务界面的切换,push一般用于同一业务不同界面之间的切换。
②present
a.跳转
b.返回
③push
a.跳转
b.返回
4.页面布局
①横竖屏控制
a.设置允许设置横竖
((AppDelegate *)[UIApplication sharedApplication].delegate).allocRotation=YES;
b.创建UIDevice的延展并添加设置屏幕控制状态
1)创建延展
2)声明set横竖屏状态方法
+(void)setNewOrientation:(UIInterfaceOrientation)orientation;
3)实现set横竖屏状态方法
+(void)setNewOrientation:(UIInterfaceOrientation)orientation{
NSNumber *resetOrientationTarger=[NSNumber numberWithInteger:UIInterfaceOrientationUnknown];
[[UIDevice currentDevice]setValue:resetOrientationTarger forKey:@"orientation"];
NSNumber *orientationTarger=[NSNumber numberWithInt:orientation];
[[UIDevice currentDevice] setValue:orientationTarger forKey:@"orientation"];
}
③调用修改横竖状态的方法
[UIDevice setNewOrientation:UIInterfaceOrientationLandscapeRight];
注意记得导入头文件
#import "UIDevice+Direction.h"
#import "AppDelegate.h
5UIDevice和UIScreen
①UIDevice
②UIScreen
6.手势
①点击
②轻扫
③长按
九,IOS实用功能
1.定制Cell
2.请求网络数据
①导入第三方库
AFNetworking
②调用请求网络数据异步代理方法
3.下拉刷新
①导入第三方库
MJRefresh
②调用下拉刷新的代理方法
③结束
4.上拉加载
①导入第三方库
MJRefresh
②调用上拉加载的代理方法
③结束
5.沙河目录
简介:沙河目录是一个用来存放本地持久化数据的文件夹,里面的数据在app更新是数据也不会被销毁,只有在APP被卸载的时候才会被销毁
①沙河目录
NSString *homePath=NSHomeDirectory();
NSLong(@"homePath=%@",homePath);
②document目录
a.路径
NSString *documentPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
b.存取持久化小数据
c.plist存取
6.FMDB
①导入第三方库
FMDB