1.修改UI控件的状态,其实就是修改控件对象的属性,每一个UI控件就是一个对象
2.懒加载 第一次使用的时候才去加载 用if语句判断 if (_array == nil) {数据}
commond+t 可以使屏幕的旋转效果变慢
commond+← →可以使屏幕旋转
xib是以view为基准
storyBoard是以controller为基准
imageNamed 带有缓存 通过imageNamed创建的图片会放到缓存中 imageWithContentsOfFile 不带缓存
视图控制器的创建和他自带view不一定同时存在 只有当视图控制器的view被使用 才会去创建 (调用loadView 调用viewDidLoad)
在没有使用view的时候 view是不存在的 那么view的子视图 更是没有创建
instancetype初始化时作为返回值 可以自动检查类型
而id不具备此功能
3.Ctrl + Commond + ↑ 在同一类中来回切换
4.从plist文件中读取数据代码写完后,记得要测试一下,数据是否以加载完毕
5.状态栏的高度是20
6.button的文字是可以修改的 button既可以显示文字又可以设置背景图片 相当于imageview和label的结合 button.titlelabel.font 修改字体大小
8. 以约定好的格式,后台开发人员将数据进行存储,前端人员按照对应的格式进行数据获取的过程.数据格式是由后台人员决定,我们无权决定
当今流行的数据格式 XML 和 JSON 对于我们来说数据解析就是根据XML或者JSON的格式进行数据的读取
7.XML:Extensible Markup language (可扩展标记语言),主流数据格式之一,可以用来存储和传输数据
9.XML解析有两种方式:SAX解析 DOM解析
SAX解析是由系统提供的,是根据协议代理回调的方式进行数据的获取 他在数据解析时,是将数据一条一条的进行读取解析 适合大型数据
五步 1.获取文件路径 2.读取文件内容 3.创建解析对象 4.设置代理 5.解析
代理 <NSXMLParserDelegate>
DOM解析:一般使用谷歌提供的第三方GDataXMLNode进行解析 对于DOM解析 会将数据整个读入内存形成一个树形结构 我们通过树形结构的层级进行 数据的获取 适合小型数据
GDataXMLNode是在C语言动态链接的基础上进行OC语言的XML解析工具 在使用时 我们需要进行三步配置
1. 导入动态链接库 libxml2.2.dylib
2.在Header Search Path中配置 /usr/include/libxml2
3.在Other Linker中配置-lxml2 1228495827 刘晓宾
10.如果一个类的属性不想被外界访问,那就在该类的.m里声明属性 反之,需要在.h里声明
11.HTTP:是应用层的文本传输协议 对于HTTP的请求方式包括两种:GET 和 POST 连接方式也包括两种:同步连接 和 异步连接
GET 和 POST的区别:
(1)GET请求:服务器地址和请求参数都会出现在请求接口中,也就是说 服务器地址和请求参数共同组成了请求接口 而POST请求,请求参数不会出现在请求接口中 而是作为请求体提交给服务器
(2)因为GET请求的请求参数会出现在请求接口中,所以信息容易被捕获,安全性低
而POST请求的请求参数封装在请求体中,作为二进制流进行传输,安全性高
(3)GET请求的请求接口中,有请求参数,而对于请求接口,我们有字节限制,这样导致GET请求有一定局限性 所以对于GET请求 只能上传小型数据,而对于POST请求,请求体理论上可以无限大,所以,一般来说 从服务器请求数据用GET 上传数据用POST
12.Foundation框架里只包括NS开头的类
UIKit框架里包含NS以及UI类
不直接用UIKit,而用Foundation框架的原因是UIKit内容太多
13.类:具有相同特征和行为事物的抽象,是对象的类型
对象:具体事物,是类的实例
14.类的接口部分:以@interface开头 @end 结尾 只要符合这种形式就可以完成类的接口部分 主要进行实例变量和方法的声明
类的实现部分:以@implementation开头 以@end 结尾 只要符合这种形式 就可以完成类的实现 主要进行方法的实现
15.NSInteger 在64位操作系统下是long 其他是short
16.点语法: 既可以调用setter 又可以调用getter 可以通过等号的位置作为判断 不需要下划线
17. NSString
(1)将符合条件的字符串进行替换
NSString *str = [NSString stringWithFormat:@“www.baidu.com”];
NSString *newStr = [str stringByReplacingOccurrencesOfString:@“w” withString:@“m”];
(2)拼接
[str stringByAppendingString];
(3)长度 length
NSInteger length = [str length];
(4)大小写转换
转换为大写
[str uppercaseString];
转换为小写
[str lowercaseString];
首字母大写
[str capitalizedString];
(5)判断开头 一般用来判断字符串的格式
BOOL isPreFix = [str hasPrefix:@“http”];
结尾
BOOL isSufFix = [str hasSuffix:@“.com”];
(6)字符串截取
subStringFromIndex:从给定位置开始截取到字符串结尾(包括当前位置)
subStringToIndex:从开头截取到给定位置(不包括当前位置)
subStringWithRange:通过给定范围进行字符串的截取
系统给我们提供了快速创建结构体的方式 NSMake + 结构体名(例如 NSRange NSMakeRange(1,10);)
18. NSMutableString
(1)增 拼接
[str appendFormat:@“”];
(2)插入
[str insertString:@“” atIndex: ];
(3)删
[str deleteCharactersInRange:NSMakeRange( , )];
(4)替换
[str replaceCharactersInRange:NSMakeRange( , ) withString:@“”];
(5)改
[str setString];
19. NSArray
initWithObjects arrayWithObjects
(1)数组元素个数
count
(2)访问数组元素
objectAtIndex
(3)通过对象找到索引值
indexOfObject: 注意:只是找到第一个满足条件的对象下标
(4)forin 遍历数组
不可变数组排序 使用sortedArrayUsingSelector:@selextor(compare:)
可变数组排序 使用
sortingUsingSelector:@selector(compare:)
20. NSMutableArray
(1)增
addObject
(2)插入
insertObject: atIndex:
(3)通过下标交换位置
exchangeObjectAtIndex: withObjectAtIndex:
(4)删
removeObject:会将所有符合条件的对象全部移除
removeObjectAtIndex:只会将对应下标的对象移除
removeObjectAllObjects:移除所有对象
(5)改
replaceObjectAtIndex: withObject:
21.快速枚举
数组:获取到每一个数组元素
集合:获取到每一个集合元素
字典:只能获取到每一个key值
注意: 在枚举过程中,不允许对集合中的元素进行增加或者减少!!!!!!!!!!!!!!!!!!!!!!!!
22. NSNumber 数值类对象
(1)整型 → 整型数值对象
NSNumber *intNum = [NSNumber numberWithInt:10];
字面量(语法糖)NSNumber *intNum = @10; 等价于使用遍历构造器创建数值对象
(2)浮点型 numberWithFloat 双精度 numberWithDouble
(3)字符型 numberWithChar:’A'
(4)整型数值对象 → 整型
int num = [intNum intValue];
字符 charValue
23. NSValue 结构体类对象
结构体 → 对象
NSValue *rangeValue = [NSValue valueWithRange:NSMakeRange( , )];
对象 → 结构体
NSRange range = [rangeValue rangeValue];
24. NSDictionary
initWithObjectsAndKeys: 在初始化时,一次性存储多个键值对(条目) 谨记,value在前 key在后 key value之间用逗号隔开
(1)通过key获取value
NSString *sex = [字典对象 valueForKey:@“key”]; 等价于 字典对象[key];
(2)获取所有的key
[dictionary allKeys];
(3)获取所有的value
[dictionary allValues];
25. NSMutableDictionary
(1)添加 增删改
setObject: forKey: 和 setValue: forKey: 都可以添加键值对,但是前者不允许添加的object为空
setValue: forKey: 不仅可以添加键值对 也可以修改甚至产生删除效果
如果键值对存在 则修改value值
如果键值对不存在 则添加新的键值对
如果给定的value参数为nil 则会删除对应的键值对
(2)通过给定key 删除对应键值对
[dictionary removeObjectForkey:];
(3)删除所有键值对
[dictionary removeAllObjects];
26.创建
(1)category类目: 为没有源代码的类添加方法,一旦添加成功就相当于原来类具有该方法
@interface + 类名(为哪一个类添加分类) + (分类名) + @end 进行方法的声明
@implementation + 类名 + 分类名 + @end 进行方法的实现
(2)Extension延展: 为有源代码的类声明私有实例变量和方法
@interface + 类名 + () + @end
(3)protocol协议: 一张任务清单 所以系统提供的模板只有.h文件 这一堆声明的方法不需要实现 由服从协议的人(delegate)去实现
@protocol + 协议名字 + <NSObject> + @end
<>表示服从 这里的NSObject是协议
的步骤是在Objective-C File中创建
27.协议代理的创建过程
(1)内3
a.声明协议
b.设置服从协议的代理(对象)
c.完成方法(触发 代理执行协议中的方法)
(2)外3
a.设置代理
b.服从协议
c.实现协议中的方法
28.属性的属性 (三大特征)
(1)读写特性
readwrite readonly
(2)原子特征
atomic (默认属性) 保证线程安全 同一时刻只能有一个线程进行访问,当访问结束后才能被下一个线程访问;有一个加锁解锁的过程
nonatomic 非原子特性 不会保护线程安全 但是,对于数据存储非常频繁,使用atomic会消耗资源 另外对于setter 和 getter 一般情况下 不会出现任何问题,所以官方推荐我们使用nonatomic
(3)语义特性
retain: 用来修饰对象类型属性,会造成引用计数加+1
copy: 用来修饰对象类型属性,会对副本对象引用计数+ 1
assign:(默认属性) 一般用来修饰非对象类型 例如:代理属性
29.黄金法则: 如果对一个对象使用了alloc retain copy 你就拥有了相应对象的所有权,你就有义务 对其进行release 或者 autorelease操作
30.当引用计数由1 ~ 0时,系统会自动调用dealloc方法,进行对象的销毁
31.autorelease 在未来的某一时刻,将对象的引用计数 - 1;一般和自动释放池连用 会将被修饰的对象放入,离他最近的自动释放池中
32.autoreleasePool: 当自动释放池自身将要销毁时,会对池子内部发送一个release消息
注意: 出池子并不意味着对象一定被销毁 空间一定被回收 只是对象的引用计数发生变化 当减小到0 才会被销毁
33.深拷贝和浅拷贝的区别
在有指针的情况下,浅拷贝只是增加了一个指针指向了已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候,就不会出现在浅拷贝时重复释放同一内存的错误
34.不可变数组是浅拷贝,相当于retain操作 对于数组元素也是浅copy 是指针的简单赋值 引用计数没有发生变化
对于可变数组 是深copy产生了新的数组对象 但是对于数组内的元素是浅拷贝 相当于retain操作
35.集合的内存管理: 集合(数组Array 字典Dictionary 集合 Set)对于自身的集合元素,有自己的一套管理方案 不需要我们帮忙
36.多态: 面向对象编程的三大特征之一,简单说就是父类的指针可以指向子类的对象 使用多态我们可以写出通用的代码 减小代码的复杂程度 例如:(UI中的addSubView:)