黑马程序员--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
2》连续调用多次autorelease
5.自动释放池
1》在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
2》当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
6.自动释放池的创建按方式
1》iOS 5.0之前
#系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
#开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象,创建对象时不要直接用类名,一般用self
block的介绍:
1、Block封装了一段代码,可以在任何时候执行
2、Block可以最为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
3、苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
block要掌握的东西
1》如何定义block变量
2>如何利用block封装代码
3.block访问外面变量
*block内部可以访问外面的变量
*默认情况下block内部不能修改外面的局部变量
*给局部变量加上_block关键字,这个局部变量就可以在block内部修改
4.利用typedef定义block类型
/*
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; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- ios中图像进行压缩方法汇总
- IOS检测指定路径的文件是否存在
- iOS、Mac OS X系统中编程实现汉字转拼音的方法(超级简单)