便利构造器的概念:
- 便利构造器是一种快速创建对象的方式。
- 它本质上是把初始化方法做了一次封装,方便外界使用。
- 便利构造器是一个类方法。
- 通常以类名开头,返回值仍然是id类型。
1. 简述autorelease的对象是在什么时候被release的,简述NSAutoreleasePool的工作机制。
autorelease的对象是延迟释放的,当池对象release或drain时,才被释放的。
NSAutoreleasePool的工作机制:
- 当创建的对象未来某个时候销毁时,可以使用对象的autorelease方法。
- 对象将所有权交给最近的NSAutoreleasePool对象。
- 当池对象drain或release时,会逐一对池内对象发送release消息。
注:
- autorelease的对象是延迟释放所有权。
- 尽量不要使用autorelease,而是使用release。
- autorelease的对象将所有权交给最近的NSAutoreleasePool对象,这些autorelease的对象在自动释放池中有着自己的队列,同样遵循栈空间中先进后出的规律:先创建的对象相对位于栈底,当池对象给池中所拥有的对象逐一发送release消息时,位于栈顶的先出栈。
2. for(int i = 0; i < largenumber; i++){
Person *p = [Person person];
[p study];
}
以上代码有什么问题,应该怎么去改?
以上代码中,是用便利构造器的方式创建了p对象,这就意味着p是autorelease的,延迟释放会导致for循环中所占的内存不断积攒,当内存耗尽时,势必造成程序的崩溃。
对于以上代码有三种修改方法:
//方法一
//在for循环内部添加自动释放池,出了自动释放池并将所拥有的对象释放掉。
for(int i = 0; i < largenumber; i++){
@autorelease{
Person *p = [Person person];
[p study];
}
}
注:
- 便利构造器的命名规范:必须以类名开头。
-
person的便利构造器为:[[[Person alloc] init] autorelease];
//方法二
//用alloc init的方式创建实例对象,同样在for循环内释放所拥有的对象。
for(int i = 0; i < largenumber; i++){
Person *p = [[Person alloc] init];
[p study];
[p release];
}
//方法三
//创建一个自动释放池,在自动释放池的生命周期内操作对象。
for(int i = 0; i < largenumber; i++){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *p = [[Person person];
[p study];
[pool release];
}