gpt4 book ai didi

objective-c - 在 objective-c 中使用 ivars 与属性的原因

转载 作者:太空狗 更新时间:2023-10-30 03:12:46 24 4
gpt4 key购买 nike

我一直无法找到关于这个主题的任何信息,而且我对它的大部分了解完全是偶然的(并且花了几个小时试图弄清楚为什么我的代码不起作用)。在学习 objective-c 的大多数教程中,我发现 make 变量和属性具有相同的名称。我不明白其中的重要性,因为似乎该属性完成了所有工作,而变量就在那里。例如:

测试.h

@interface Test : NSObject {
int _timesPlayed, _highscore;
}

@property int timesPlayed, highscore;

// Methods and stuff

@end

测试.m

@implementation Test

@synthesize timesPlayed = _timesPlayed;
@synthesize highscore = _highscore;

// methods and stuff

@end

我所知道的

1) 好的,所以今天我发现(经过几个小时的困惑)无论你对属性 highscore = 5091231 做了多少改变,当你尝试调用 [ test highscore] 因为它仍然会返回 _highscore 的值,我认为它是在 test.h 中设置的 ivar。因此,test.m 中所有变量的更改都需要更改 _highscore 而不是 highscore。 (如果我在这里错了请纠正我)

2) 如果我理解正确(我可能没有理解),test.h 中设置的 ivars 代表实际内存,而 @properties 只是访问该内存的方法。因此,在实现之外,我无法在不通过属性的情况下访问 _highscore。

我不明白的地方

基本上,对于这种情况,我不明白我是否需要使用 ivar,或者我是否可以只使用 @property 和 @synthesize。似乎 ivars 只是额外的代码,除了让我感到困惑之外什么也没做。我见过的一些最新的 tuts 似乎没有使用 ivars,但有些却使用了。那么这只是编码偏好问题还是真的很重要?我曾尝试搜索 Apple 的文档,但我在那里迷路了,似乎从来没有找到我要找的东西。任何指导将不胜感激。

最佳答案

您可以将合成属性的语法视为@synthesize propertyName = variableName

这意味着如果您编写 @synthesize highscore = _highscore;,将为您创建一个名为 _highscore 的新 ivar。因此,如果您愿意,可以通过转到 _highscore 变量直接访问存储该属性的变量。

一些背景

在某些我不记得的编译器版本之前,综合语句不会创建 ivar。相反,它只说明了它应该使用什么变量,所以你必须同时声明变量和属性。如果您使用下划线前缀进行合成,那么您的变量需要具有相同的前缀。现在您不必再自己创建变量,而是将创建一个具有您在综合语句中指定的 variableName 的变量(如果您尚未自己声明它,在这种情况下它仅用作属性的支持变量)。

你的代码在做什么

您在声明变量时显式创建一个名为 highscore 的 ivar,然后在合成属性时隐式创建另一个名为 _highscore 的 ivar。它们不是同一个变量,因此更改其中一个不会改变另一个。

是否应该使用变量?

这真的是一个关于偏好的问题。

专业变量

有些人觉得,如果您不必到处写 self.,代码会变得更干净。人们还说它更快,因为它不需要方法调用(尽管它可能永远不会对您的应用程序性能产生可衡量的影响)。

专业属性

更改属性的值将调用所有必要的 KVO 方法,以便其他类可以在值更改时得到通知。默认情况下对属性的访问也是原子的(不能从一个以上的线程访问)所以从多个线程读取和写入属性更安全(这并不意味着属性指向的对象是线程安全的,如果它是一个可变数组,那么多线程仍然会破坏事情,这只会阻止两个线程将属性设置为不同的东西。

关于objective-c - 在 objective-c 中使用 ivars 与属性的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com