Objective-C 中的属性和实例变量

2024-05-24

我对 Objective-C 中的属性和实例变量感到相当困惑。

我正在阅读 Aaron Hillegass 的“Mac OS X 的 Cocoa 编程”,一切都很合乎逻辑。你可以像这样声明一个类:

@class Something;

@interface MyClass : NSObject {
    NSString *name;
    NSArray *items;

    Something *something;

    IBOutlet NSTextField *myTextField;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
  • 由于其他对象需要操纵我们的name and items实例变量,我们使用@property/@synthesize为它们生成访问器/修改器。在我们的类中,我们不使用访问器/修改器——我们只是直接与实例变量交互。

  • something只是我们将在类中使用的一个实例变量,并且由于没有其他人需要使用它,因此我们不会为它创建一对访问器和修改器。

  • 我们需要与 UI 中的文本字段进行交互,因此我们声明一个IBOutlet对于它,连接它,我们就完成了。

一切都非常合乎逻辑。

然而,在iPhone世界里,情况似乎有所不同。人们为每个实例变量声明属性,为IBOutlets,并使用访问器/修改器与实例变量交互within班级(例如,他们会写[self setName:@"Test"]而不是name = @"Test").

为什么?到底是怎么回事?这些差异是 iPhone 特有的吗?为所有实例变量声明属性有什么好处,为IBOutlets,并在您自己的类中使用访问器/修改器?


在 iPhone 世界中,没有可用的垃圾收集器。您必须通过引用计数仔细管理内存。考虑到这一点,请考虑以下之间的区别:

name = @"Test";

and

self.name = @"Test";
// which is equivalent to:
[self setName: @"Test"];

如果您直接设置实例变量,而不事先考虑,您将丢失对先前值的引用,并且无法调整其保留计数(您应该有release手动进行)。如果您通过属性访问它,它将自动为您处理,同时增加新分配对象的保留计数。

基本概念不是 iPhone 特有的,但在没有垃圾收集器的环境中它变得至关重要。

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

Objective-C 中的属性和实例变量 的相关文章

  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • NSPoint/NSRect 来自 NSTextView 中的字符

    所以我试图获取与 NSTextView 中特定字符的位置相对应的 NSPoint 或 NSRect 这就是我到目前为止所拥有的 效果不是很好 结果似乎有点不可预测 NSRange theTextRange theTextView layou
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

    相关这个问题 https stackoverflow com questions 1082554 我想把数据加载放在后台 但是 我收到 库例程调用不按顺序 错误 In 这个所以线程 https stackoverflow com quest
  • 如何在没有 SDK 的情况下在 Objective C 中为 S3 创建预签名 URL?

    我正在构建一个 mac 应用程序not使用 AWS iOS 开发工具包 我尝试构建的 GET 请求应遵循以下通用格式 Authorization AWS AWSAccessKeyId base64 hmac sha1 VERB n CONT
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 为什么 Objective-C 允许在方法定义末尾使用分号? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 实现文件中方法名后面的分号 https stackoverflow com questions 5678360 semicolon after the method name
  • ld:找不到 -lGoogleToolboxForMac 的库

    我正在通过 pod 实施 firebase 设置 我的 Pods 文件如下所示 Uncomment the next line to define a global platform for your project platform io
  • 寻找可靠的方法来选择iPhone 13微距相机设备

    我正在使用 objc 开发一个应用程序 我必须选择 iPhone 13 Pro 和 13 Pro Max 中配备的新微距摄像头 目前 我在所有其他设备上选择我的相机 并剪掉此代码 AVCaptureDeviceDiscoverySessio
  • NSObject的retain方法是原子的吗?

    NSObject的retain方法是原子的吗 例如 当从两个不同的线程保留同一个对象时 是否允许保留计数增加两次 或者保留计数是否可以只增加一次 Thanks NSObject以及对象分配和保留计数函数都是线程安全的 请参阅附录 A 线程安
  • tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

    我有一个带有UITableView 我允许通过滑动来编辑 删除 的行 就像在邮件应用程序中一样 我用以下方法来做到这一点 BOOL tableView UITableView tableView canEditRowAtIndexPath
  • 强制本地化图像或图像资产

    正如在这个问题中 如何强制 NSLocalizedString 使用特定语言 https stackoverflow com questions 1669645 how to force nslocalizedstring to use a
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • 获取动画滚动视图的当前位置

    我遇到了以下问题 我对 uiscrollview 进行了子类化 其中 contentOffset 通过以下代码进行动画处理 UIView animateWithDuration 1 0 delay 1 0 options options a
  • XOR或其他简单的文件混淆方法ios目标c

    我正在开发一个使用受版权保护的 pdf 文件的 ios 应用程序 我正在寻找一些简单的方法来混淆文件以确保安全 这些方法不需要我经历额外的大众市场 CCATS 加密审查流程 但也将确保版权所有者已尽我所能来保证他们的数据安全 当然 我用密码
  • Textview 中心文本对齐 IOS 7

    void observeValueForKeyPath NSString keyPath ofObject id object change NSDictionary change context void context NSLog He
  • 块如何捕获其封闭范围之外的变量?

    我知道 Objective C 块可以捕获并设置其封闭范围之外的变量值 它是如何做到的 它实际上相当简单 并在 Clang 的块实现规范中进行了描述 在 导入变量 http clang llvm org docs Block ABI App

随机推荐