码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C - autorelease详解

时间:2015-04-23 11:02:03      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:objective   autorelease   自动释放池   计数器   

autorelease详解

/*
 1.autorelease的基本用法
 1> 会将对象放到一个自动释放池中
 2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
 3> 会返回对象本身
 4> 调用完autorelease方法后,对象的计数器不变

 2.autorelease的好处
 1> 不用再关心对象释放的时间
 2> 不用再关心什么时候调用release

 3.autorelease的使用注意
 1> 占用内存较大的对象不要随便使用autorelease
 2> 占用内存较小的对象使用autorelease,没有太大影响


 4.错误写法
 1> alloc之后调用了autorelease,又调用release
 @autoreleasepool
 {
    // 1
    Person *p = [[[Person alloc] init] autorelease];

    // 0
    [p release];
 }

 2> 连续调用多次autorelease
 @autoreleasepool
 {
    Person *p = [[[[Person alloc] init] autorelease] autorelease];
 }

 5.自动释放池
 1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
 2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池


 6.自动释放池的创建方式
 1> iOS 5.0前
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 [pool release]; // [pool drain];


 2> iOS 5.0 开始
 @autoreleasepool
 {

 }
 */

#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Person *pp = [[[Person alloc] init] autorelease];

    [pool release]; // [pool drain];

    @autoreleasepool
    {

        // 1
        Person *p = [[[[Person alloc] init] autorelease] autorelease];

        // 0
        // [p release];
    }

    return 0;
}


void test()
{
    @autoreleasepool
    {// { 开始代表创建了释放池

        // autorelease方法会返回对象本身
        // 调用完autorelease方法后,对象的计数器不变
        // autorelease会将对象放到一个自动释放池中
        // 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
        Person *p = [[[Person alloc] init] autorelease];

        p.age = 10;



        @autoreleasepool
        {
            // 1
            Person *p2 = [[[Person alloc] init] autorelease];
            p2.age = 10;


        }


        Person *p3 = [[[Person alloc] init] autorelease];


    } // } 结束代表销毁释放池
}
@interface Person : NSObject

@property (nonatomic, assign) int age;

@end
#import "Person.h"

@implementation Person
- (void)dealloc
{
    NSLog(@"Person---dealloc");

    [super dealloc];
}
@end

autoreleased的应用

#import "Person.h"
#import "GoodPerson.h"

/*
 1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的

 2.开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象
 1> 创建对象时不要直接用类名,一般用self
 + (id)person
 {
    return [[[self alloc] init] autorelease];
 }
 */

int main()
{
    @autoreleasepool {
        Person *p = [Person personWithAge:100];


        GoodPerson *p2 = [GoodPerson personWithAge:10];

        p2.money = 100;
    }
    return 0;
}

void test()
{
    Person *p = [[Person alloc] init];

    p.age = 200;

    [p release];

    // 包
    // Student com.mj.test
    // Student com.mj.test2

    // MJStudent

    // SBStudent

    // Next Step


    @autoreleasepool
    {
        //        Person *p2 = [Person person];
        //
        //        p2.age = 100;

        Person *p2 = [Person personWithAge:100];

        //        Person *p2 = [[[Person alloc] init] autorelease];
        //
        //        p2.age = 300;


        NSString *str = @"123123";

        NSString *str2 = [NSString stringWithFormat:@"age is %d", 10];

        NSNumber *num = [[NSNumber alloc] initWithInt:10];
        [num release];


        NSNumber *num2 = [NSNumber numberWithInt:100];
    }
}
@interface Person : NSObject
@property (nonatomic, assign) int age;


+ (id)person;

+ (id)personWithAge:(int)age;

@end
@implementation Person


+ (id)person
{
    return [[[self alloc] init] autorelease];
}


+ (id)personWithAge:(int)age
{
    Person *p = [self person];
    p.age = age;
    return p;
}

- (void)dealloc
{
    NSLog(@"%d岁的人被销毁了", _age);

    [super dealloc];
}
@end
#import "Person.h"

@interface GoodPerson : Person

@property (nonatomic, assign) int money;

@end
@implementation GoodPerson

@end

Objective-C - autorelease详解

标签:objective   autorelease   自动释放池   计数器   

原文地址:http://blog.csdn.net/wangzi11322/article/details/45217403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!