(二)
一、自定义初始化方法(5min)
1、init方法只能在初始化时调用
2、自定义初始化方法可以带参数(命名规则)
方法命名:类名首字母大写,变量名和方法名首字母小写,使用驼峰标示
二、self与super关键字
id关键字:可以代表任何类型(代码演示)
self关键字:在方法里面,哪个对象调用了此方法,self就是指的哪个对象,哪个类调用了就是指的哪个类(函数中不能调用self)
类方法的self调用
三、点语法
点号左边是赋值,调用的是setName,
等号右边是访问,
代码演示:定义一个类,{属性、方法(初始化方法、set与get方法、普通方法)}
规则1: 点语法调用set方法,点语法在等号左边,调用set方法
点语法注意:1、只能调用set或者get方法(或者格式相同的方法)(可以尝试用点语法调用普通方法,调用不到)
//点语法后面的name和age不是属性,是set方法的后半部分
规则2:点语法在=后边,调用的是get方法
//点语法注意:
set与get方法的概念:
set方法:set开头,带一个参数
get方法:有返回值,无参数
四、命名规则 变量命名与C语言相同,类名首字母大写,方法名首字母小写
五、类与类之间的关系
继承
关联:两个类之间存在一种联系,Person、Dog、Car
(三)
一、封装
1.属性封装
处于安全性考虑,我们一般不在成员变量名前面使用。@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。
@public 公开的,public修饰的成员变量外部可以直接访问
@private 私有的,只能在类的内部才可以访问
子类不可以访问private修饰的属性
@protected 受保护的学会难过,类的内部,子类都可以访问,类的外部不能访问
@package 修饰的变量,这个变量只能在当前所在的框架中使用(很少用到,但是系统会用到)
1)使类的属性不让外部直接访问
2)外部使用这个类时,不需要关心这个类具有哪些属性
2,方法的封装
只是调用方法,不去关心方法里面是如何实现的,只是知道调用这个方法可以达到我的需求。不关心.m文件中的实现
1)对功能实现细节的隐藏与封装
2)保护属性(保护属性的有效性)
二、继承
1、概念:可以多层继承,但是每个类只能有一个父类
子类可以继承父类的属性与方法,减少代码量,
把子类中共有的东西抽出来,作为一个父类
**super关键字
卡车中不光有自己的方法,还有从父类继承下来的方法
[super 方法名];会调用父类的方法
[self 方法名];会先从本类中查找方法,如果有,会调用,如果没有,会调用父类的
self 调用当前方法会导致死循环问题
**方法重写:
满足条件:1、必须有继承关系
2、参数列表必须一样(方法名和参数列表完全一致)
三、多态
同一种类型的不同表现形态
1、必须存在继承关系
2、子类重写父类方法
3、父类声明的变量指向子类对象
四、#import与@class的区别
#import是把头文件拷贝
//如果这里使用#import,会引起相互包含,程序运行出错
//@class 只是告诉编译器有这么一个类,在别处声明好了,但是类的具体实现不知道
在.h
文件里用@class
,在.m
文件中用#import
(四)
一、类目
比较简单
1、给NSString扩展一个方法:验证邮箱,我们目前所学的知识:写一个子类,写一个方法来实现。
但是,NSString是不能被我们自定义继承的,还有NSArray,NSDictionary等,一般不要写一个类继承与Foundation中的类
在子类中写一个验证方法,可以解决,但是,在以后想调用此方法时,只能通过新增加的类去创建,增加了类增加了项目的复杂度
一般写方法在.h文件中声明,在.m文件中实现,但是我们不能修改NSString的.h文件,我们也访问不到NSString的.m文件
还可以通过类目
选择OC文件,选择Category,Class中选择要为哪一个类拓展类目
为一个类扩展一个类目以后,在类目中写方法,这个方法属于这个类的一部分,可以被这个类的子类继承
缺陷:1、不能为类拓展实例变量(属性)
2、可以覆写类中原有的方法,覆写后,原始方法不能被调用(一般不推荐为OC提供给我们的类覆写方法)
二、延展(匿名的类目)
私有方法
三、定时器
代码不会停在定时器里,执行过了,会在每个X秒调用一次所调用的方法
停止的话,需要用定时器对象来控制NSTimer
四、协议(消息的传递)
1、现实中的协议,租房子
2、协议不是一个类,而是定义了一组方法,让其他类来实现,他要做的仅仅是声明
协议定义了一组方法,这些方法是需要谁签订了协议谁去实现
五、小孩与保姆
六、代理设计模式:
1、一般谁有事请自己做不了,需要别人帮,我们就在这个类的.h文件中定义协议
2、在这个类中需要一个代理对象(属性),该代理对象要实现定义的协议
3、代理在自己的类中对协议方法做实现
4、代理调用代理方法
(五)
一、为什么要进行内存管理。
由于移动设备的内存极其有限,所以每个
APP
所占的内存也是有限制的,当
app
所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。
管理范围:
任何继承
NSObject
的对象,对其他的基本数据类型无效。
本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。
二、
给对象发送消息,进行相应的计数器操作。
Retain
消息:使计数器
+1
,该方法返回对象本身
Release
消息:使计数器
-1
(并不代表释放对象)
retainCount
消息:获得对象当前的引用计数器值
三、
当一个对象的引用计数器为
0
时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条
dealloc
消息,一般会重写
dealloc
方法,在这里释放相关的资源,
dealloc
就像是对象的“临终遗言”。一旦重写了
dealloc
方法就必须调用
[super dealloc]
,并且放在代码块的最后调用(不能直接调用
dealloc
方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
四、原则
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法(黄金法则)
(2)不是你创建的就不用你去负责
(3)谁retain,谁release
五、@property
的参数
(1)内存管理相关参数
Retain:
对对象
release
旧值,
retain
新值(适用于
OC
对象类型)
Assign:
直接赋值(默认,适用于非
oc
对象类型)
Copy:release
旧值,
copy
新值
(2)是否要生成
set
方法(若为只读属性,则不生成)
Readonly:
只读,只会生成
getter
的声明和实现
Readwrite:
默认的,同时生成
setter
和
getter
的声明和实现
(3)多线程管理(苹果在一定程度上屏蔽了多线程操作)
Nonatomic:
高性能,一般使用这个
Atomic:
低性能
(六)
iOS4.3支持功能不完善的ARC,只是不能使用weak
不是垃圾回收机制,不是垃圾回收,还是内存管理,引用计数
一、
1、只要还有一个变量(指针)指向对象,对象就会保存在内存中,就像气球可以有好几根绳子,绳子都断掉的时候,气球销毁
- ARC中,dealloc方法中不允许调用[super dealloc];
- ARC中,不允许使用retainCount属性打印引用计数
- ARC中,不允许使用retain,release,autorelease,但是copy可以使用
只要
2、strong:只要有指针指向对象,对象就不会被销毁,默认所有实例变量和本地变量都是strong类型的指针(strong reference)
weak:弱引用,当弱引用指向的对象不存在了,弱引用会指向nil
3、__unsafe和__unretained
和weak功能一致,区别是当对象指向的对象销毁后,不会将变量重置为nil,这样会有可能调用野指针
二、ARC使用注意
1、创建一个对象时不能使用__weak
2、关于数组取值后将数组移除所有元素的问题
三、ARC与非ARC混编(-fno-objc-arc)
四、Xcode转换工具(使用注意:尽量每个文件只使用一次,使用前保留副本)
(七)
一、KVC键值编码
setValue:() forKey:()/valueForKey
setValue:()forKeyPath/valueForKeyPath
二、KVO
1、属性改变必须书通过KVC或者set方法改变
2、第一步:添加观察者
第二步:接收变更通知
第三步:移除观察者
三、通知
1、发出通知
2、添加通知的监听器
3、移除通知
四、谓词
定义谓词条件
把谓词交给数组
重点在于怎么定义条件(常用格式)