普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量。-(void)show;输出 … 访问属性
属性:属性专门处理实例变量。(程序执行过程当中)
初始化方法:一创建对象(第一时间),给实例变量赋值。
工厂方法:只一个方法,帮我们解决创建对象问题、初始化对象的问题。工厂方法创建对象最简单。(对象达到一定量级)
补:在类方法中,可以调用类中创建的实例的实例方法或实例变量。
算法、设计模式:
是人们总结的一种规律,一种思想。
1.单例模式
是一种特殊的工厂方法。
“单例”:只有一个唯一的。
单例模式的好处,节约资源、提高效率、统一管理。
2.内存管理
iOS开发中,对堆内存的创建、销毁(释放),就叫做内存管理。
内存管理有两种方式:
MRC:手动内存管理。
ARC:自动内存管理。
引用计数器:用来记录对象被引用的次数,每个对象天生就有一个引用计数器。
Reference Counting
引用的次数:一个对象被几个引用使用。
TRStudent *stu = [[TRStudent alloc]init];
TRStudent *stu2 = stu;
在xcode5以后,都是强制使用ARC内存管理的。
需要手动改成MRC内存管理:
项目->BuildSetting->All->ARC->OC language->OC ARC=NO;
强制操作系统立刻回收内存:
edit scheme->Diag…->Enable Zombie Objects
内存管理的机制:
每个对象都有自己的引用计数器。 在MRC内存管理模式下,引用计数器计算机是无法自动操作的。
向对象发送[对象 retainCount];该对象引用计数器的值
当向对象发送alloc、copy、new消息的时候,该对象的引用计数器会自动设置为1.
当不再使用对象的时候的时候,会发送release消息,通知引用计数器”减”1。
当一个对象的引用计数器的值为0时,”系统”会”自动”销毁该对象,并回收该内存空间。
当对象销毁的时候,会”自动”发送dealloc消息。
内存管理使用不当: 通过引用使用一个以经不存在的对象(堆空间),会出现异常、crash(Exception)。
解决:1.野指针问题,使用空指针来解决野指针问题。
对象不在使用的时候,忘记发送release消息,内存溢出(内存浪费)(内存泄露)。
2.多个引用使用同一个对象,需要retain操作。
解决:1.谁创建的内存(谁加1),谁就有责任减1。
2.声明式属性解决加1操作,但减1操作依然需要手动处理。
new相当于
[TRStudent new] 相当于 [[TRStudent alloc]init]
.m文件中的dealloc方法
-(void)dealloc{
NSLog(…);
[super dealloc];
}
3.声明式属性
a.默认情况下 声明式属性 并没有解决内存问题
b.如果需要解决内存问题 需要加上(retain)
@property(retain) TRBook* book;
c.声明式属性解决的只有setter/getter问题 加1操作
d.dealloc中减1操作 依然需要我们自己做。
如果一个对象中的属性是对象类型,声明式属性记得加retain关键字修饰
当一个对象销毁的时候,应该将其拥有的属性对象,全部release
[email protected](参数类型1,参数类型2)
参数类型1:
retain:修饰属性是对象类型
assign:修饰基本数据类型,默认是assign类型
copy:修饰一些特殊的对象类型,NSString
readonly:只有getter方法,没有setter方法。
readwrite:有setter方法,也有getter方法。
getter=method:可以修改getter方法的方法名。
setter=method:可以修饰setter方法的方法名。
参数类型2:(多线程)
atomic 原子性操作 解决线程安全问题 消耗资源 默认值
nonatomic 非原子性操作 存在线程安全问题 节省资源
4.自动释放池
a.自动释放池可以帮我们解决自动释放(release)对象的操作。 b.工厂方法存在内存释放的问题、getter内存释放的问题、创建多个对象的时候,容易忘记释放对象。
c.语法规则 :
@autoreleasepool{
}
d.默认情况下,自动释放池不会管理对象,需要手动将对象放到自动释放池中,由自动释放池管理对象。
e.向对象发送autorelease消息,就可以将对象放到自动释放池中管理。
f.自动释放池的开始、结束
autorealespool{开始
。。。
}结束
当自动释放池结束的时候,会向池中的对象发送release消息