gpt4 book ai didi

objective-c - Objective C实例变量/属性的多重声明

转载 作者:行者123 更新时间:2023-12-04 18:19:13 26 4
gpt4 key购买 nike

我对 ObjC 还是很陌生。我注意到创建你的所有地方都是非常标准的

@interface myObj : NSObject {
id delegate;
NSDictionary *dict;
}

接着
@property (nonatomic,retain) NSDictionary *dict;
@property (retain) id delegate;

- 例如。由于 Declared Properties,我知道@property 的自动代码生成+ 更清晰的定义是多么有用。在 Apple 上翻页。然而,我不明白的是,为什么人们同时做这两个标准是标准的——声明他们的属性,然后将它们再次放在{大括号}中。

我的意思是,如果我有一个类,其中我希望某些变量具有自动 getter/setter 而有些不具有,那么我会理解为我的常规变量设置 {} block ,然后只创建 @property/@synthesize 语句只是那些我想要添加功能的特定变量;但是,为什么在您知道希望所有实例变量都具有 getter 和 setter 的情况下始终同时拥有这两种方法是标准的呢?我想我要跳闸了,因为我基本上在 100% 的时间里看到它像这样使用,而我觉得它真的没有必要……只需声明 @properties 并保留它。

想法?最佳编码实践建议?还是我在这里遗漏了一些信息?

最佳答案

您所看到的在早期版本的 Objective-C 中是必需的,但现在不再需要了。

在 NeXT 使用的第一个 Objective-C 版本中,直到引入新的运行时(在 Mac OS X 上使用 Objective-C 2.0),所有实例变量都必须在其 @interface 中声明为类结构的一部分。 .原因是如果你对一个类进行子类化,编译器需要知道类的实例变量布局,以便它可以看到放置子类的实例变量的偏移量。

当引入属性时,综合属性必须由类结构中的实例变量“支持”。因此,您必须同时声明实例变量和属性。

以上所有都不再正确。较新的 Objective-C 在查找实例变量偏移的方式上不那么脆弱,这意味着一些变化:

  • 并非所有实例变量都需要在 @interface 中.现在可以在 @implementation 中定义它们。 :尽管由于可能发生冲突和其他问题,因此不在类别中。
  • 可以根据属性定义推断和创建合成属性的实例变量。
  • 您可以以编程方式将实例变量添加到您在运行时创建的类(仅在您将类注册为系统可用之前)。

  • 因此,重申一下,您只需要在旧版本的 Objective-C 语言中声明实例变量和综合属性。您所看到的内容是多余的,不应被视为“最佳实践”。

    关于objective-c - Objective C实例变量/属性的多重声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033775/

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