objective-c中的局部声明有什么区别

Ped*_*ace 3 declaration local objective-c ios

这些声明有什么区别,让我们称之为红色和橙色:优点,缺点?

红色和橙色的声明

Dun*_*n C 5

红色集是属性,橙色集是实例变量.

属性声明告诉编译器定义一个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.如果确实定义了属性,则应使用它而不是实例变量.