@property 和 @synthesize

2024-01-28

我对 Objective C 很陌生(两天了)。当读到关于@synthesize,好像和我的理解有重叠@property(我以为我理解了)......所以,一些细节需要在我的脑海中解决......这让我烦恼。

如果我对差异的理解有误,请纠正我@property and @synthesize:

如果你声明一个@property在你的@interface,那么您就告诉全世界,用户可以期望对该属性使用标准的 getter 和 setter。此外,XCode 将为您创建通用的 getter 和 setter。...但是,到什么程度that@property 声明会发生这种情况吗? (即,这是否意味着“完全”......就像您中看不见的声明一样@interface,以及您中看不见的代码@interface?

-Or-

Does @property处理你的代码中看不见的代码声明@interface仅 - 而@synthesize负责处理您中看不见的代码实现@implementation部分? )


首先,请注意最新版本的 Xcode 根本不再需要 @synthesize。您可以(并且应该)忽略它。也就是说,这就是这些部件的作用。

@property是访问器的声明。这只是一个声明。以下内容之间几乎没有什么区别:

@property (nonatomic, readwrite, strong) NSString *something;

vs.

- (NSString *)something;
- (void)setSomething:(NSString)aSomething;

主要区别在于使用声明这些方法@property让编译器自动为您生成(综合)实现。不需要让编译器为您做这件事。您完全可以自由实施something and setSomething:手工制作,这是很常见的事情。但是,如果你不手动实现它们,编译器会自动为你创建一个名为_something并为 getter 和 setter 创建合理的实现。

在旧版本的 Xcode 中,您必须使用以下命令显式请求自动生成@synthesize关键词。但现在不再需要这样了。今天,使用的唯一理由@synthesize是如果你希望 ivar 有一个非标准名称(永远不要这样做)。

这里的一个关键点是方法something and setSomething: are 只是方法。它们并没有什么神奇之处。它们不是特殊的“属性方法”。它们只是按照惯例访问某个状态的方法。该状态通常存储在 ivar 中,但并非必须如此。

更清楚地说:object.something does not意思是“返回名为的ivar_something from object.” 意思是“返回结果[object something],无论它做什么。”返回 ivar 的值是很常见的。

您应该使用以下方式声明您的所有状态(内部和外部)@property声明,并且应该避免直接声明 ivars。您还应该始终通过其访问器访问您的属性(self.something),除了在init and dealloc方法。在init and dealloc,你应该直接使用 ivar (_something).

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

@property 和 @synthesize 的相关文章

  • 如何使用 NSUndoManager 支持替换 UITextView 中的文本?

    我希望能够以编程方式替换 UITextView 中的某些文本 因此我将此方法编写为 UITextView 类别 void replaceCharactersInRange NSRange range withString NSString
  • CGColorRef 导致崩溃

    我的代码发生了崩溃 并且我一直跟踪到在传递 2 个 CGColorRefs 时发生崩溃的行 以下是对象 CGColorRef startColor UIColor colorWithWhite 0 92 alpha 1 0 CGColor
  • 为什么 Objective-C 数组参数不使用冒号表示法?

    我目前正在从大牧场指南书中学习一些 Objective C 我的理解是 具有多个参数的方法使用冒号来分隔每个参数 但是在阅读有关创建数组的内容时 我发现了以下代码片段 NSArray dateList NSArray arrayWithOb
  • TabBarController:以不同方向定向视图

    我无法保持当前的观点方向 在下面的设置中 我能够将第一个视图控制器锁定为纵向 将第二个视图控制器锁定为横向或纵向 但是 当我向选项卡控制器添加第二个导航控制器 rootviewcontroller 时 整个项目中的所有视图都将变为横向和纵向
  • 加快 SpriteSheet 的 UIImage 创建速度

    我不确定我的标题是否正确 但我不确定我的问题到底在哪里 我需要从 spritesheet 加载 UIImage 数组 然后将其用作 UIImageView 中的动画 spritesheet是用TexturePacker生成的 它生成巨大的图
  • 如何消除圆形矩形按钮周围的间隙而不删除其周围的边框? [复制]

    这个问题在这里已经有答案了 顺便提一句 这可能看起来像是关于按钮阴影问题的问题的重复 但它们有单调的背景 在我的例子中 背景是一些图像 所以简单的边框不能解决问题 While making app for iPhone Pad I noti
  • 关于 Swift 中重写类属性的困惑

    我已阅读 Swift 文档并在这里搜索 但我仍然不确定如何实现类层次结构 其中每个子类为继承的静态属性设置自定义值 那是 基类定义了一个静态属性 所有实例共享相同的值 子类覆盖静态属性 所有实例共享相同的值 这与基类不同 财产可以储存吗 另
  • javascript:检查对象是否具有特定元素或属性的最佳方法?

    假设我有这个 var person name John Doe email email protected cdn cgi l email protection 该对象只有两个元素 称为name and email 有些人还有一个要素age
  • 强制变量声明的协议 - Objective C

    是否可以在 protocol中声明变量 只是为了强制程序员在实现类 实现此协议的类 标头和实现中添加这些变量 Thanks 简短回答 不 不可能那样做 您最多可以强制方法和属性的可用性
  • 转发 UIAlertView 的可变参数

    我正在尝试设置一个非常简单的UIAlertView带有文本编辑 确定和取消按钮 我想根据文本编辑的内容禁用确定按钮 为了能够保留委托 以便他不会在警报视图之前消失 从而在用户对警报视图执行某些操作时立即导致崩溃 我对其进行了子类化 现在 我
  • 具有自定义视图的相机

    我的应用程序使用相机 我想在相机预览上添加叠加层 例如 我想在使用相机时使用相框 还想添加一个用于相机操作的自定义栏 请帮助我做同样的事情 您可能正在尝试使用 UIImagePickerController 但我知道这个可以解决你的问题 您
  • 编程界面方向更改不适用于 iOS

    因此 我有一个项目 当用户按下按钮时 我需要强制改变方向 我创建了一个github 上的示例应用程序 https github com vradenburg ForcedOrientationChange来演示这个问题 interface
  • iOS 5 Twitter 框架和completionHandler 块 - “在此块中强烈捕获‘自我’可能会导致保留周期”

    我对编程和 Objective C 非常陌生 我正在尝试找出我的代码出了什么问题 我已经阅读了一些有关块的内容 但我不知道到目前为止我所阅读的内容与我的代码有何相关 我的代码使用 iOS 5 Twitter 框架 我使用了 Apple 提供
  • abc.abstractmethod + 属性

    根据docs http docs python org 3 3 whatsnew 3 3 html abc它应该能够结合起来 property and abc abstractmethod所以以下应该在 python3 3 中工作 impo
  • 如何跟踪此对象图深度优先搜索算法中的深度?

    我有这段代码 它迭代一棵树 进行深度优先搜索 每个元素都只处理一次 非常好 void iterateOverTree TreeNode node NSMutableArray elements NSMutableArray array el
  • 使用 in 子句按数组顺序对 NSPredicate 进行排序

    我有一个NSPredicate会在一个内搜索 idNSArray的 ID 就像是 id in array 有没有办法获得按相同数组顺序排序的提取结果集 我现在的代码是 NSArray findIn NSArray identifiers i
  • 如何在iPhone sdk静音模式下播放声音文件?

    如何在iPhone sdk静音模式下播放声音文件 我正在尝试以静音模式播放声音文件 但结果为零 我试过这段代码 SystemSoundID soundID AudioServicesCreateSystemSoundID CFURLRef
  • initWithFrame 与 initWithStyle

    我想从已弃用的 TableView 中更新initWithFrame reuseIdentifier 我的表格视图使用自定义单元格 到处都说要使用initWithStyle 并且它不会以任何方式改变行为或细胞initWithFrame CG
  • Objective-c:如何检测视图上的双击?

    我正在开发一个应用程序 其中视图上有多个控件 但我想在用户双击视图时启用它们 您可以以双击为例 但在设备中我想在双击时捕获事件 您需要添加一个UITapGestureRecognizer到您想要点击的视图 像这样 void viewDidL
  • 使用 Xcode 资产目录缓存 UIImage

    我们都知道UIImage神秘的幕后缓存机制imageNamed 方法 在苹果的UIImage 类参考 https developer apple com library IOS documentation UIKit Reference U

随机推荐