——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;
}