初学iOS,对OC机制理解可能还不深入,需要后期大量学习,在此记录只为回顾每天的知识点。
OC内存管理:
-alloc:分配内存空间,可以理解为C语言中的malloc
-retain:引用计数。比如实例化一个对象时,给该对象的引用计数器加1
-release:引用计数。与retain配对,给对象的引用计数器减1
引用计数是苹果早期使用的一种内存管理技术,与C++的手动管理内存一样被人诟病。忘了释放内存会造成内存泄漏,提前释放又可能导致其他引用该对象的指针变成空指针从而引起程序崩溃。所以后来提出了自动管理的技术ARC,这样就不用手动管理内存的分配和释放,带来的不利之处是导致性能降低,因为该技术不考虑任何逻辑,在对象实例化时增加技术,释放时减少技术,即使一些不必这样操作的也会如此,所以会降低一定的性能。
-ARC
-autorelease:自动释放。这里的自动释放并不是说该内存空间会自动在销毁时释放,可以说应该叫延迟释放,比如这一帧可能不释放,下一帧就释放了。这个主要是用来避免频繁的申请和释放内存空间。
Property结构
许多OOP中都有setter和getter,也就是设置和获取成员变量的值,如果要在OC中实现,就得写这一串又臭又长的东西:
-(void) setName : (NSString *)name
{
_name = name;
}
-(NSString *) name
{
return _name;
}
由于有了property,大大方便了程序的编写:
在头文件,即.h中声明:
@property (NSString *) name;
在实现文件中,即.m中:
@sythesize name;
property的声明语法为:@property (选项1,选项2) 类型 属性名
这里的选项有几种选择,主要分为三类:1.读写属性:readonly/readwrite 2.setter:assign/copy/strong(retain) 3.原子操作:atomic/nonatomic。备注:在以前的版本中使用的是retain,由于苹果推出ARC内存管理机制后,不允许使用retain,所以后来使用strong作为替代。接下来详细说说这些属性。
1.读写属性:readonly表示这个属性是只读的,即只生成getter不生成setter。readwrite表示提供访问
2.setter:assign可以理解为alloc,即直接给该变量分配内存地址,基本数据类型可采用该选项。copy,建立一个引用计数为1的对象,再释放旧对象。strong,强引用。copy和strong可以理解为值拷贝和指针拷贝,copy不推荐使用。
3.原子操作:atomic意味着开启多线程,即程序会保护多线程的运行,setter会变成这样:
[lock]
if (property != newValue)
{
[property release];
property = [newValue retain];
}
[unlock]
nonatomic,顾名思义,就是关闭线程,因为iOS作为一款手持设备,其性能有限,在没有多线程通信时关闭atomic可以减少资源消耗。
Category
该特性是OC区别于其他语言的代表,主要功能是对某个类进行功能扩展时无需派生子类,可以直接在原有类的基础上进行添加。比如要给某个类增加一个方法:
@interface Geek (extension)
-(void) method;
@end
这样,所有的Geek类实例化都有了这个方法,而无需更改任何东西即可直接调用。
Protocol
协议。可以理解成Java里的interface,也就是没有共同父类可以调用的公共方法。
@protocol Function
-(void) methodA
-(void) methodB
@end
然后,如果在一个类的声明中@interface ClassA<Function>{}@end,就可以理解为ClassA实现了该协议,即可以对ClassA的实例化调用methodA和methodB方法。
另外protocol还可以和委托结合起来。
Delegate
委托。在定义protocol(协议)时,可以加入两个选项,@required,@optional。可以理解成:委托就是把事情交给别人去办,required里的是必须要办的,optional是可办可不办的。
实现代码明天再写,囧。
delegate其实跟protocol并没有什么关系,delegate更像是一种设计的思路。这个思路就是在A类中调用B类的方法,而protocol又可以提供所需要的方法,即B实现protocol,A通过B调用该方法,所以protocol经常和delegate写在一起。