黑马程序员--autorelease和Block

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

/*
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
 {
    Person *p = [[[Person alloc] init] autoreleasepool];
    [p release];
 }

2》连续调用多次autorelease

 @autoreleasepool
 {
    Person *p = [[[[Person alloc] init] autoreleasepool] autoreleasepool];
 }

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

6.自动释放池的创建按方式
1》iOS 5.0之前

NSAutoreleasepool *pool = [[NSAutoreleasepool alloc] init];
 [pool release]; 或者[pool drain];

#系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
#开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象,创建对象时不要直接用类名,一般用self

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

#import 
@interface Person : NSObject

@property (nonatomic, assign) int age;

+ (id)person;
@end

@implementation Person

+(id)person
{
    return [[[Person alloc] init] autorelease];
}
- (void)dealloc;
{
    NSLog("@%d岁的人被销毁了", _age);

    [super dealloc];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool
    {
        Person *p1 = [Person person];

        p.age = 100;
    }
    return 0;
}

block的介绍:
1、Block封装了一段代码,可以在任何时候执行
2、Block可以最为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
3、苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
block要掌握的东西
1》如何定义block变量

 int (^sumBlock)(int, int);
 void (^myblock)();

2>如何利用block封装代码

 ^(int a, int b)
 {
 return a - b;
 };
 ^()
 {
 NSLog(@"-----");
 }

3.block访问外面变量
*block内部可以访问外面的变量
*默认情况下block内部不能修改外面的局部变量
*给局部变量加上_block关键字,这个局部变量就可以在block内部修改

4.利用typedef定义block类型

#import 

//定义一个Myblock类型
typedef int  (^Myblock)(int, int);

int main(int argc, const char * argv[])
{
    int (^sumblock)(int, int) = ^(int a, int b)
    {
        return a + b;
    };
    int c = sumblock(10, 11);
    //typedef
    //Myblock sumBlock;
    //sumblock = ^(int a , int b)
    //{
    //   return a + b;
    //}


    void (^lineBlock)(int) = ^(int n)
    {
        for (int i = 0; iNSLog(@"----------");
        }
    };
    return 0;
}


你可能感兴趣的:(黑马程序员--autorelease和Block)