黑马程序员——OC基础---基础语法(二)
------- android培训、ios培训、期待与您交流! ----------
内容概括:
1、介绍内存管理相关参数。
2、@class的作用和使用规范。
3、Autorelease方法的使用和注意。
4、自动释放池的使用。
一、内存管理的的相关参数
1、set方法内存管理的相关参数。
* retain :release旧值,retain新值。(适用于OC对象)
* assign :直接复制(默认,适用于非OC对象类型。)
* copy :copy旧值,release新值。
2、是否生成set方法的参数。
* readwrite :同时生成get方法和set方法。
* readonly :只会生成get方法的声明和实现。
3、多线程管理
* nonatomic :性能高(一般用这个)
* atomic :性能低(默认)
4、决定set方法和get方法名称的写法
* @property(getter = abc)weight;
上述语句使get方法的名称有weight变为abc。
注意:改变方法名通常只用于get返回BOOL类型数据,且方法名以is开头。
二、@class的使用
使用场景:当两个类互相包含时,在.h文件中会形成循环引用,这是要用@class对类做一个属性的声明。
1、@class的作用:仅仅告诉编译器,某个名称是一个类,@class Person // 告诉编译器Person是一个类。
2、开发中引用一个类的规范
1. 在.h文件中用@class声明一个类。
2. 在.m文件中用#import来包含类的所有内容。
3、两端循环引用的解决方案。
1.一端用retain,另一端用assign。
(身份证和人)
人Person的头文件:
#import <Foundation/Foundation.h>
#import "Card.h"
// @class仅仅是告诉编译器,Card是一个类
//@class Card;
@interface Person : NSObject
@property (nonatomic, retain) Card *card;
@end
身份证card的头文件:
@class Person; // 告诉编译器Person是一个类。
@interface Card : NSObject
@property (nonatomic, assign) Person *person; // 使用assign防止循环引用。
@end
三、Autorelease方法的使用和注意。
1、方法autorelease
1> autorelease方法返回对象本身。
2> autorelease会将对象放在一个自动释放池里。
3> 自动释放池被销毁时,会对所有池子里德尔对象做一次release操作。
4> 调用完autorelease后计数器不变。
2、优点
1> 不再关心对象释放的时间。
2> 不用关心什么时候调用release。
3、注意
1> 占用内存大的对象轻易不用。
2> 占用内存小的没有太大影响。
@autorelease
{
Person *p = [ [ [ Person alloc] init] autorelease ];
[ p release]
}
上述代码中绿色命令不能写两次,红色部分为错误语句。
四、自动释放池
1、在IOS程序运行过程中,会创建无数池子,这些池子都是以栈结构存在。(先进后出)
2、当一个对象调用autorelease方法时,会将这个对象放到栈顶释放池。
注意:
1、系统自带的方法里面包含alloc、new、copy说明返回的对象都是autorelease类型的。
2、开发中经常写一个类方法,类方法直接返回一个autorelease类型的对象。
3、NSString创建的对象默认为autorealease类型。
4、Dealloc方法是计数器归零时,系统自动调用。