红色集是属性,橙色集是实例变量.
属性声明告诉编译器定义一个getter方法,可能还有一个setter方法.(如果属性是只读的,则没有setter方法.)
在较新版本的Objective C中,声明属性还会创建一个用于保存属性值的实例变量.按照惯例,实例变量与属性具有相同的名称,但带有"_"前缀.有一种方法可以更改实例变量的名称,但是现在让我们忽略它.
物业foo:
@property (nonatomic, strong) NSString *foo;
Run Code Online (Sandbox Code Playgroud)
会有一个getter方法:
- (NSString *) foo;
Run Code Online (Sandbox Code Playgroud)
和一个setter方法
- (void) setFoo: (NSString *) foo;
Run Code Online (Sandbox Code Playgroud)
这使您可以使用这样的代码:
NSString *aString = self.foo;
Run Code Online (Sandbox Code Playgroud)
要么
NSString *aString = [self foo];
Run Code Online (Sandbox Code Playgroud)
(2种不同的,同样有效的方法来调用getter)
并调用setter
self.foo = @"a string";
Run Code Online (Sandbox Code Playgroud)
要么
[self setFoo: @"a string"];
Run Code Online (Sandbox Code Playgroud)
(2种不同的,同样有效的调用setter的方法)
当您想要创建一个公共接口以从外部获取和设置类中的值时,属性非常有用.如果将属性声明为"原子",则编译器会向getter和setter添加其他代码,因此对该属性的读写操作是"线程安全的",并且可以从后台线程访问.
在ARC之前,属性也是管理保留和发布的非常简洁的方法.您将属性声明为"retain",并且编写了setter以保留传入的对象.这在ARC中不是问题,因为系统会为您处理保留和释放.
也可以编写一个自定义getter或setter方法来调用您自己的代码而不是编译器编写的代码.您可以使用它来执行诸如日志信息,发送有关更改的通知,更新标签等等.您只需将方法体添加到.m文件中,该方法体具有与getter或setter相同的方法签名,并且编译器使用该方法体方法而不是自动生成的方法.
正如我之前所说,代码:
self.foo = @"a string";
Run Code Online (Sandbox Code Playgroud)
是相同的
[self setFoo: @"a string"];
Run Code Online (Sandbox Code Playgroud)
并调用setter方法.setter方法设置内部实例变量_foo.
但是,代码
_foo = @"a string";
Run Code Online (Sandbox Code Playgroud)
直接更改实例变量,而不调用setter.如果确实定义了属性,则应使用它而不是实例变量.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |