我什么时候应该明确使用@synthesize?

2024-01-27

据我所知,从 XCode 4.4 开始@synthesize将自动生成属性访问器。但刚才我读了一个关于的代码示例NSUndoManager,并且在代码中它注意到@synthesize被明确添加。喜欢:

@interface RootViewController  ()

@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@property (nonatomic, strong) NSUndoManager *undoManager;

@end

@implementation RootViewController
//Must explicitly synthesize this
@synthesize undoManager;

我现在很困惑......我应该什么时候添加@synthesize明确地写到我的代码?


答案有很多,但也有很大的困惑。我会尝试下一些订单(或增加混乱,我们会看到......)

  1. 让我们停止谈论 Xcode。 Xcode 是一个IDE。铿锵是一个compiler。我们正在讨论的这个功能称为属性的自动合成这是一个clang 支持的 Objective-C 语言扩展 http://clang.llvm.org/docs/LanguageExtensions.html#objective-c-autosynthesis-of-properties,这是 Xcode 使用的默认编译器。
    需要明确的是,如果您在 Xcode 中切换到 gcc,您将不会从该功能中受益(无论 Xcode 版本如何)。同样,如果您使用文本编辑器并从命令行使用 clang 进行编译,您将无法从该功能中受益。将要。

  2. 感谢自动合成,您不需要显式地合成该属性,因为它将由编译器自动合成为

    @synthesize propertyName = _propertyName
    

    但是,也存在一些例外情况:

    • 具有自定义 getter 和 setter 的读写属性

      当提供bothgetter 和 setter 自定义实现,属性不会自动合成

    • 具有自定义 getter 的只读属性

      为只读属性提供自定义 getter 实现时,不会自动合成

    • @dynamic

      使用时@dynamic propertyName,该属性不会自动合成(非常明显,因为@dynamic and @synthesize是互斥的)

    • @protocol 中声明的属性

      当遵守协议时,协议定义的任何属性都不会被自动合成

    • 在类别中声明的属性

      在这种情况下,@synthesize编译器不会自动插入指令,但也无法手动合成该属性。虽然类别可以声明属性,但它们根本无法合成,因为类别无法创建 ivar。为了完整起见,我会补充一点,这仍然是可能的使用 Objective-C 运行时伪造属性合成 https://stackoverflow.com/questions/8733104/objective-c-property-in-category.

    • 覆盖的属性(自 clang-600.0.51 起新增,随 Xcode 6 一起发布,感谢 Marc Schlüpmann)

      当您覆盖超类的属性时,您必须显式合成它

值得注意的是,合成属性会自动合成后备 ivar,因此如果缺少属性合成,ivar 也会丢失,除非明确声明。

除了最后三种情况之外,一般的理念是,每当您手动指定有关属性的所有信息时(通过实现所有访问器方法或使用@dynamic)编译器会假设您想要完全控制该属性,并将禁用其自动合成。

除了上面列出的情况外,唯一使用显式@synthesize将指定一个不同的 ivar 名称。然而约定很重要,所以我的建议是始终使用默认命名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候应该明确使用@synthesize? 的相关文章

随机推荐

  • Django-CKEditor 不会渲染图像

    我已经安装了 Django CKEditor 并对其进行了配置以用于开发目的 现在我可以编辑文本并将其作为文本字段保存到数据库中 但是在插入图像时我遇到了很大的问题 我可以插入图像 它似乎可以正确保存到本地主机 正确的文件夹 但是当将图像渲
  • 如何更改 setInterval 和 setTimeout 函数中“this”的范围

    怎么可能使用this代替setInterval and setTimeout calls 我想这样使用它 function myObj this func function args setTimeout function this fun
  • 如何解决Require.js中的循环依赖?

    基本上 这个想法是 子 模块创建一个对象 并且该对象应该是作为 主 模块的实用程序库的一部分 然而 子 对象depends关于 main 的实用程序 Main module define sub function sub var utils
  • NameError:未初始化的常量 Bundler

    我刚刚将我的网络服务器更改为 Puma 并且必须将我的开发数据库从 sqlite 更改为 postgresql 但现在每次我尝试运行 rake db migrate 时都会收到此错误 rake aborted NameError unini
  • 为 ObjectContext 创建接口

    我正在尝试创建一个抽象层ObjectContext 我理解 OC 是一个工作单元 但我并不完全了解如何为它编写一个好的界面 理想情况下 我希望能够交换实现的 RealDataContext IDataContext对于像 FakeDataC
  • 求解 a^3 + b^4 = c^3 + d^3 最佳运行时间

    注意 这个问题不同于写出 a 3 b 3 c 3 d 3 的所有解 https stackoverflow com questions 14454133 write all solutions for a3 b3 c3 d3因为我需要帮助理
  • SQL 如果 select 语句不返回任何行,则执行替代 select 语句

    基本上 什么语法可以让我实现标题声明 If select statement 1 returns 0 rows THEN select statement 2 else select statement 3 以便 sql 返回语句 2 或
  • 将图库中的所有图像加载到 android 中的应用程序中

    我正在创建一个应用程序 其中我需要图库中的所有图像到我的应用程序中 其中有一个 girdview 我希望所有文件夹中的所有图像都显示在网格视图中 String proj MediaStore Images Media DATA MediaS
  • 如何从 pytorch 模块获取子模块序列?

    对于火炬module https pytorch org docs master generated torch nn Module html 我想我可以用 named children named modules等来获取子模块的列表 但是
  • 为什么 d3.js v3 在实现缩放时会破坏我的力图,而 v2 不会?

    我有一个使用 d3 js 创建的强制布局 我希望同时拥有可拖动力布局的正常功能以及缩放功能 我基本上已经从 http jsfiddle net nrabinowitz QMKm3 http jsfiddle net nrabinowitz
  • 在 SQL Server 日期时间字段中格式化日期时间的正确方法是什么

    我在 C 中有一个 dateTime 对象 我想插入 SQL Server 日期时间字段 正确的格式是什么 正确的方法是使用参数化查询 not文本格式 然后你就可以使用强类型SqlDbType DateTime http msdn micr
  • 反应本机平面列表不滚动

    我已经使用 FlatList 很多次了 但从未有过这样的经历 我有一个视图 页面顶部有一个图像 而我的列表在下面 当我尝试滚动时 列表弹到顶部 对此找不到好的解决方案 这是我的清单
  • 在 Play Framework 中使用 POST 路由参数

    我有一个登录路由 应将其输入参数作为 POST 变量传输 我已经这样定义了我的路线 POST v1 accounts login controllers v1 Accounts login username String password
  • 标准WPF选项卡控件中是否有Selected Tab Changed事件

    在WPF中 是否有一个事件可以用来确定何时TabControl选定的选项卡发生变化吗 我尝试过使用TabControl SelectionChanged但是当孩子在选项卡中的选择发生更改时 它会被多次触发 您需要检查事件的来源以隔离最外层的
  • UISegmentedControl 委托/触摸事件

    我有一个 UISegmentedControl 有六个段 我希望它们在值更改时调用一个方法 而且当每个段获得一个UIControlEventTouchDragIn因为我希望当用户尝试选择 UILabel 上的某些内容并将手指拖过控件时 UI
  • 在哪里可以找到 IntelliJ 其他语言的词典?

    IntelliJ 拼写检查器仅捆绑了英语和阿拉伯语 奇怪 我认为它是在东欧制造的 他们甚至没有捆绑他们的语言 我的客户是德国人 所以我的所有代码都是英语 代码 德语 界面 混合的 而且我找不到 IntelliJ 的德语词典 当前的IDEA版
  • 排除字符串列表中的相似点以提取差异

    我有一个句子列表 除了书名之外 其他句子都相同 如何循环遍历列表并排除相似之处以找到书名 这是一个例子 可以是任何有相似之处的短句 蝇王 这本书堪称经典 杀死一只知更鸟 是一本经典之作 麦田里的守望者 这本书堪称经典 我遇到的问题是我不能简
  • 如何阻止 Telerik RadWindow 在下一次回发时始终重新加载

    我在网页中调用 RadWindow 作为对话框 我从代码隐藏中调用 因为我需要传递一些参数 radWindow1 NavigateUrl url 英国 德国 法国 radWindow1 VisibleOnPageLoad true 这很有效
  • ruby on Rails 的 Mahout 插件

    我想在 Ruby on Rails 项目中使用 Apache Mahout 来实现推荐和协作过滤 特别是我的要求是 建议相关标签 推荐相关文章 根据用户的喜好提示他评论文章 根据用户的地理位置和其他元信息 向他推荐类似的用户 如果任何其他解
  • 我什么时候应该明确使用@synthesize?

    据我所知 从 XCode 4 4 开始 synthesize将自动生成属性访问器 但刚才我读了一个关于的代码示例NSUndoManager 并且在代码中它注意到 synthesize被明确添加 喜欢 interface RootViewCo