您的位置:首页 > 移动开发 > Objective-C

黑马程序员—Objective-C基础_内存管理(2)

2014-03-27 00:15 239 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------


autorelease方法


1> 会将对象放到一个自动释放池中

2> 当自动释放池被销毁时,会对池内所有对象做一次release操作

3> autorelease方法会返回对象本身

4> 调用autorelease方法之后,对象的计数器不变

自动释放池

在程序运行过程中,可以创建多个自动释放池。自动释放池以栈的形式存在内存中(先进后出)

当对象调用autorelease方法时,会将该对象放到栈顶的释放池

创建自动释放池 

int main()
{
    // 创建自动释放池
    @autoreleasepool{
        // 创建对象,并调用autorelease方法
        Person *p = [[[Person alloc] init] autorelease];
    } // 自动释放池销毁,对象销毁

    return 0;
}

当对象占用内存较大时,不要使用autorelease。调用autorelease之后,不用再使用release。

一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。

开发中可以提供一些类方法来快速创建已经autorelease的对象

+ (id)person

{

    // 创建对象时,不直接使用类名,使用self

    return [[[self alloc] init] autorelease]

}
ARC(Automatic Reference Counting)

在ARC模式下把指针分为两种

强指针:默认情况下,所有指针都是强指针__strong

弱指针:__weak 

ARC的判断准则:只要没有强指针指向对象,就会释放对象

@interface Person : NSObject
@property(strong,nonatomic) Dog *dog;
@end

@implementation Person
// 重写dealloc
-(void)dealloc
{
    NSLog(@"Person被杀死了");
    // [super dealloc];不允许调用
}
@end

@interface Dog : NSObject
@property(weak,nonatomic) Person *person;
@end

@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog被杀死了");
}
@end

int main()
{
    // ARC模式下的循环调用
    Person *p = [[Person alloc] init];
    Dog *d = [[Dog alloc] init];
    
    p.dog = d;
    d.person = p;

    return 0;
}// 程序结束,所有对象被销毁

ARC特点

1> 不允许调用release、retain、retainCount

2> 允许重写dealloc,但是不允许调用[super dealloc]

3> @property参数

    strong:成员变量是强指针(适用于OC对象类型)

    weak:成员变量是弱指针(适用于OC对象类型)

    assign:适用于非OC对象类型

4> 用strong替代retain
ARC中的循环引用:strong替代retain,weak替代assign 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------
详细请查看:http://edu.csdn.net 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: