objective-c -- property

@property、objective-c

1、”.”语法可能调setter,也可能调getter

1
2
xx.a=1  
NSlog("%d",xx.a)

2、可改变存取器的名字

getter= 让getter方法使用自定义的名字

setter = 让setter方法使用自定义名字

@property(getter=isRunning) BOOL running

使用方法:

1
2
3
4
Car *honda = [[Car alloc] init];
honda.running = YES;
NSLog(@"%d",honda.running);
NSLog(@"%d",[honda isRunning]);

3、readonly不合成setter方法

4、nonatomic属性

原子性(Atomicity)的作用是属性在多线程的环境中怎么行为。当你不仅仅有一个线程, 那么getter和setter可能会在同一时间去调用,这就意味着getter/setter可能会被另一个方法打扰,很有可能造成数据错误。

原子的属性会封锁object,防止这种情况发生,确保get或者set操作的操作对象是完整的。没有被损坏。然而,这仅仅是一个线程安全的方面,我们必须要理解这一点。使用原子性并不能确保我们的代码就是线程安全的

5、strong属性

无论对象被指定为什么属性,强壮的属性可以创建拥有关系,这对所有对象属性来说是一种内隐行为,它默认是安全的,因为只要它被指定为strong属性,它就会确保对对象的值存在

举个例子:

1
2
3
@interface Person : NSObject
@property(nonatomic)NSString *name;
@end

它的实现如下,@property产生的使用的默认存储方法,也重写了NSObject的描述方法,返回一个代表该对象的字符串

1
2
3
4
5
6
7
#import "Person.h"
@implementation Person
-(NSString *)description
{
return self.name;
}
@end

然后,添加Person的属性给Car,改变Car.h:

1
2
3
4
5
6
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Car : NSObject
@property (nonatomic) NSString *model;
@property(nonatomic,strong) Person *driver;
@end

接着

1
2
3
4
5
6
7
Person *john = [[Person alloc] init];
john.name = @"John";

Car *honda = [[Car alloc] init];
honda.model = @"Honda Civic";
honda.driver = john;
NSLog(@"%@ is driving the %@",honda.driver,honda.model);

只要driver是一个strong关联,honda对象就会持有john,这确保只要honda需要它,它就会有效

6、weak 属性

在属性和指定value之间创建一个不拥有关系,使用这个防止循环引用。

大多数情况下,强属性可以直观知道你想要什么对象属性,强引用会暴漏一个问题,例如,我们需要从driver引用他正在开的Car对象,首先,我们需要给Person添加一个car属性:

Person.h

1
2
3
4
5
6
7
8
9
10
#import <Foundation/Foundation.h>

@class Car;

@interface Person : NSObject

@property(nonatomic)NSString *name;
@property(nonatomic,strong)Car *car;

@end

@class Car 是对Car类的前声明,就像它告诉编译器,“相信我,Car类是存在的,所有不要想着去立刻找到它”。我们不用#import这样做,因为Car也导入了Person.h,那样我们会陷入无尽的导入循环

然后,添加下面的代码,在honda、driver分配后:

1
2
3
4
5
6
7
Person *john = [[Person alloc] init];
john.name = @"John";
Car *honda = [[Car alloc] init];
honda.model = @"Honda Civic";
honda.driver = john;
john.car = honda; //添加这行
NSLog(@"%@ is driving the %@",honda.driver,honda.model);

这样我们现在有一个现象,就是john拥有honda,honda拥有john。这就意味着他们相互拥有,所以尽管他们不再有用,内存管理系统也不能够释放他们。

这叫做 retain cycle(保持循环),是一种内存泄露的形式,内存泄露是很不好的。幸运的是,要想解决这个办法很简单,只需要告诉其中一个属性维持一个weak属性引用另一个对象。在Person.h中,改变car的声明:

@property(nonatomic,weak)Car *car;

这种weak(弱)属性会给car创建一个非拥有关系。它允许john有一个honda的引用,同时避免了保持循环。但是,还有一个可能性就是honda会被销毁,而这个时候john正在引用honda,如果这种情况发生,weak属性会很方便地设置car为nil,去避免悬挂指针。

7、 copy属性

它是strong的替代品,不是保持拥有一个存在的对象,而是创建一个引用,无论你指定什么属性,都会持有这个拥有。只有符合NSCopying protocol的对象才能使用这个属性。

代表值的属性(相对于链接或关系)是一个使用copy的不错选择。例如,开发者通常复制字符串属性,而不是强引用它们

strong是引用,copy是复制一份,保存当时的值,无论原对象值如何变化


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!