黑马程序员_object c学习日记④_内存管理二:@property参数强化、@class及autorelease

来源:互联网 发布:苹果破解软件下载 编辑:程序博客网 时间:2024/04/29 15:42

-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------

@property参数:

@property (retain) Book *book;

// retain:自动生成setter里面会release旧值,retain新值。

①  内存管理相关参数

l  retain:release旧值,retain新值(适用于oc对象类型)

l  assign:直接赋值(默认,适用于非oc对象类型)

l  copy:release旧值,copy新值

②  是否要生成set方法

l  readwrite:同时生成setter和getter的声明、实现(默认)

l  readonly:只会生成getter的声明、实现

③  多线程管理

l  nonatomic:性能高

l  atomic:性能低(默认)

④  setter和getter方法名称

l  setter:决定了set方法的名称,一定要有冒号

l  getter:决定get方法的名称(一般用在BOOL类型)

 

@class

@class的作用:仅仅告诉编译器,某个名称是一个类

@class 类名

开发中引用一个类的规范

1>  在.h文件中用@class来声明类

2>  在.m文件中用#import来包含的所有东西

3>  非ARC:两端循环引用解决方案:一端用retain,一端用assign

 

autorelease的基本用法:

方法会返回对象本身,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作。

调用完autorelease方法后,对象的计数器不变

autorelease的好处:

①  不用再关心对象释放的时间

②  不用再关心什么时候调用release

autorelease的注意点:

①  占用内存较大的对象不要随便使用autorelease

②  占用内存较小的对象使用autorelease,没有太大意义

错误写法:

①  alloc之后调用了autorelease,又调用release

②  连续调用多次autorelease

 

自动释放池:

ios5.0前

NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc] init];

[pool release];

 

ios5.0后:

@autoreleasepool创建自动释放池

①  在ios程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)

②  当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池

 

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

2 开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象

创建对象时不要直接用类名,一般用self

-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------

0 0