黑马程序员 --- @property参数

来源:互联网 发布:大数据开发方向啥意思 编辑:程序博客网 时间:2024/05/19 07:09

@property参数


@property是编译器的指令;@property int age;用来告诉编译器要做三件事:1.定义一个实例变量2.在.h中声明这个实例变量的set、get方法3.在.m中实现这个实例变量的set、get方法。这是Xcode4.4后为我们做的简化操作。

@property三类参数如下:@property (参数1参数2 等)类型变量
1.原子性:atomic(对属性加锁,多线程下线程安全,默认值);
nonatomic(对属性不加锁,多线程下不安全,但是速度快)
2.可读性:readwrite(可读可写settergetter)  readonly(只有getter方法)
3.内存管理:assign(直接赋值基本类型 非oc类型)
retain(release 旧值 再retain新值,在MRC中使用适合 oc类型)

copy(release 旧值,再copy新值,一般用于NSString)

weak:弱指针(在ARC中使用,适用于OC对象类型,相当于MRC中的assign)

strong:强指针(在ARC中使用,适用于OC对象类型,相当于MRC中的retain)

原子性:这两个关键字除非在多线程下注重安全问题时,设为atomic,其他都可以设为nonatomic

可读性:如果不想让外界对实例变量修改的话,就设为readonly,例如:

#import <Foundation/Foundation.h>@implement Person :NSObject@property (nonatomic ,readonly) int age;@end

内存管理:retainCount 是记录对象内存引用次数(retain,copy,release),retain使用说明:

//Student.h:#import <Foundation/Foundation.h>@interface Student : NSObject@property (nonatomic ,retain) Dog *dog;@end

//Student.m#import "Student.h"@implementation Student : NSObject-(void)setDog:(Dog *)dog{if(_dog != dog){              //判断两个变量相等[_dog release];         //不相等先把以前的_dog释放掉_dog = [dog retain]; //retainCount计数器加一}-(void)dealloc{[_dog release];[super dealloc];}@end

strong和weak指针:为了ARC 搞出来两个指针关键字,strong强指针指向一块内存区域就说明这快内存区域不能

//Student.h:#import <Foundation/Foundation.h>#import "Dog.h"@interface Student : NSObject@property (nonatomic ,strong) Dog *dog;@end

//Student.m#import "Student.h"@implementation Student : NSObject-(void)setDog:(Dog *)dog{if(_dog != dog){              //判断两个变量是否相等_dog = dog; //retainCount计数器加一}}-(void)dealloc{NSLog(@"Dog dealloc");[super dealloc];}@end

//main.m#import <Foundation/Foundation.h>#import "Student.h"#import "Dog.h"int main(int argc, const char * argv[]){ <span style="white-space:pre"></span>@autoreleasepool {<span style="white-space:pre"></span>Student *stu= [Student new]; //  此时stu就是强指针,因为默认是强指针,<span style="white-space:pre"></span>//[stu release];  不能出现这类语句,因为这是ARC<span style="white-space:pre"></span>//等stu这个在栈区的变量生命周期结束后,内存就接着被释放了,因为没有任何强指针指向这块内存区域了<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return 0;}

@property参数各个功能都已说明了,它这些参数对于项目开发过程中内存的管理是非常有用的,我们一定要熟练掌握它们,好了就这么多。


0 0