——- android培训、java培训、ios培训期待与您交流!
一、 property用法
1.set方法内存管理相关的参数
retain:release旧值,retain新值(适用于OC对象类型)
assign:直接赋值(默认,只用于非OC对象类型)
copy:release旧值,copy新值
@interface Percon:NSObject
@property(retain) (Car *)car;
@end
//相当于
@interface Person:NSObeject
-(void)setCar:(Car *)car;
-(Car *)car;
@end
@implementation Person
-(void)setCar:(Car *)car;
{
if(car!=_car)
{
[_car release];
_car=[car retain];
}
}
-(Car *)car
{
return _car;
}
@end
2.是否生成set方法
readonly:只生成get方法的声明和实现
readwrite:同时生成get方法和set方法的声明和实现
//使用方法
@interface Person:NSObject
@property(readonly) age;//只读
@property(readwrite)(NSString *)name;//可读可写
@end
3.多线程管理
nonatomic:性能高(一般都用这个)
atomic:性能低(默认)
4.set和get的方法的名称
适用与BOOL类型
setter:决定了set方法的名称,一定要有冒号
getter:决定了get方法的名称
返回BOOL类型的方法名一般以is开头
一般使用在BOOL类型的get方法
@interface Person:NSObject
@property(getter=isRich)BOOL rich;
@end
二、@class用法
循环引用,当类A需要引用类B,类B又需要引用类A的时候,如果使用@import将会出现错误,因此需要使用@class。
@class 类名;仅仅是告诉编译器它只是一个类的名称,并不包含该类的任何内容。如果需要使用该类中的内容还是需要在@implementation中@import这个类。
@class和@import的区别
1. import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,并不包含类的任何内容。
2. 如果有上百个文件import同一个文件,一旦开始的文件稍加改动,后面所有引用这个文件的所有类都需要重新编译,这样效率非常低,而@class则不会。
3. 在.m文件中,如果需要使用那个类,还是需要在@implementation中使用@import那个类。
内存管理
循环引用的时候如果使用@property(nonatomic,retain)声明变量程序最后无法彻底释放内存。
解决方案:
1.一个调用retain(计数器加1)
2.一个调用assign(直接赋值,计数器不加1)
三、autorelease
3.1 自动释放池
1.在ios程序运行中,会创建无数个池子,这些池子都是以栈结构存在(先进后出原则)。
2.当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池,销毁释放池的时候会对对象进行一次调用release方法(计数器减1)。
代码:
有两个类Person,Car
int main()
{
@autoreleasepool
{
Person *p=[[[person alloc] init] autorelease];
Car *c=[[[Car alloc] init] autorelease];
}
return 0;
}
//相当于
int main()
{
Person p=[[person alloc] init];
Car *c=[[Car alloc] init];
[c release];
[p release];
return 0;
}
四、总结
4.1 @property
1.使用@property可以自动生成getter和setter方法,摒弃大量的重复代码
2.@property参数:assign、retain、readwrite、readonly、nonatomic、atomic
3.@property可以为set方法和get方法重新命名
4.循环引用对象:一端使用retain,另一端使用assign
4.2autorelease
1.使用autorelease可以将对象自动添加到自动释放池中,统一对对象进行release
2.精确控制对象的内存管理,占用内存空间大的对象,不要使用autorelease
3.占用内存空间小的对象,可以使用autorelease
4.3内存管理原则
1.谁retain、alloc、new、copy对象,谁release对象
2.对象组合使用时,重写dealloc方法,精确控制每一个对象的内存空间
3.循环引用对象时,一端使用@import,另一端使用@class,只用真正使用到对象的属性和方法时,再@import对象