OC--属性修饰符

在第一篇OC的文章中,说到面向对象的时候,说到两个重要的概念:类和对象。文章中写了一个Dog类,代码如下:

Dog.h文件中代码

@interface Dog : NSObject


//Dog3个属性

@property (nonatomic,copy)NSString *sex;//性别

@property (nonatomic,copy)NSString *age;//年龄

@property (nonatomic,copy)NSString *name;//名字


//Dog2种行为

- (void)eat;

- (void)walk;


@end

在这个类中,说到有3个属性。表示类的特征。当我们使用Dog类去创建任何一个对象的时候,对象都会有着3个属性。

在我的理解中,这些属性还有另外一个名字:成员变量。上面的代码中出现了@property、nonatomic、copy这几个单词。今天这篇文章就是对这些的讲解分析。


在开发中,使用@property声明一个属性的时候,要给属性添加一些修饰符,例如:retain、copy、weak、strong、assign、nonatomic、atomic等。这些修饰符如何使用,对于不明白的开发人员来说,是一大难题。有时候就是因为使用错了修饰符而导致程序莫名其妙的就崩溃了。下面我们来逐个分析:

atomic:生成的setter、getter操作为原子操作,为系统默认,执行性能低。

nonatomic:生成的setter、getter操作是非原子操作,推荐手动设置为nonatomic属性,执行性能高。

assign:用来修饰值类型,这里的值类型我们可以理解为基础数据类型(NSInteger)和C语言类型数据(int,float,double,char,bool)。不会更改引用计数。

retain:释放旧对象,并使传入的新对象引用计数+1。只能用于NSObject及其子类。

strong:强引用,会将对象的指针指向新的地址,并持有一个新对象,这个新对象的引用计数+1。

weak:弱引用,只是引用属性的指针,而不持有属性,属性的引用计数不会+1。和assign类似,但是不同的是,当指向的对象被释放后,weak会被自动置空,而assign不会置空,所以会导致野指针出现,所以,在声明delegate的时候使用weak,当使用assign修饰的时候,需要手动给delegate置空。

copy:复制,cpoy只能修饰遵守NSCoping协议的类,copy的作用是在内存上开辟出一片新的空间,然后将调用者复制进去,这样对于调用者而言,引用计数是不变的。但是对于一些不可变类型,如:NSString、NSArray、NSDictionary、NSSet之类,copy并不会在内存上开辟新的空间,而是为调用者的引用计数+1,这里等同于retain。


值得注意的是copy也属于强引用,但是在使用中和strong还是又很大的区别,在修饰不可变类型数据的时候要使用copy。这样就可以避免将可变数据赋值给不可变数据是出现问题。

考虑一下这段代码会发生什么事,如果没有修饰为Copy时:
    NSMutableString *mString = [[NSMutableString alloc] initWithString:@"string"];
    self.value = mString;

这里创建一个可变的字符串对象,并赋值给了一个声明为不可变的字符串对象。这样导致本来指向不可变字符串对象的value指向了一个可变字符串对象。
但如果用了Copy修饰,那么在赋值前,可变的字符串对象先Copy为不可变字符串对象,再赋值到value上,这样就可以避免一些不可避免错误发生。

所以对这些不可变类的声明需要用Copy而不是Strong 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值