您的位置:首页 > 职场人生

黑马程序员--autorelease和Block

2015-07-28 15:09 477 查看
——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 <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>

//定义一个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; i<n; i++)
{
NSLog(@"----------");
}
};
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios