Objective-C中的ivars和properties有什么区别

2023-11-25

在 Objective-C 中使用 ivars 和属性的这 3 种方式之间的语义差异是什么?

1.

@class MyOtherObject; 
@interface MyObject {
}
@property (nonatomic, retain) MyOtherObject *otherObj;

2.

#import "MyOtherObject.h"
@interface MyObject {
    MyOtherObject *otherObj;
}
@property (nonatomic, retain) MyOtherObject *otherObj;

3.

#import "MyOtherObject.h"
@interface MyObject {
    MyOtherObject *otherObj;
}

Number 1与其他两个不同的是,前向声明 MyOtherObject 类以最大限度地减少编译器和链接器看到的代码量,并且还可能避免循环引用。如果您这样做,请记住将 #import 放入 .m 文件中。

通过声明 @property(并匹配 .m 中的 @synthesize)文件,您可以自动生成访问器方法,并按照您指定的方式处理内存语义。大多数对象的经验法则是保留,但 NSStrings,例如应该使用复制。而单例和委托通常应该使用分配。手写访问器既乏味又容易出错,因此这可以节省大量打字和愚蠢的错误。

此外,声明合成属性允许您使用点符号调用访问器方法,如下所示:

self.otherObj = someOtherNewObject; // set it  
MyOtherObject *thingee = self.otherObj; // get it 

而不是正常的消息传递方式:

[self setOtherObject:someOtherNewObject]; // set it
MyOtherObject *thingee = [self otherObj]; // get it 

在幕后,您实际上正在调用一个如下所示的方法:

- (void) setOtherObj:(MyOtherObject *)anOtherObject {

    if (otherObject == anOtherObject) {
        return;  
    }

    MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
    otherObject = [anOtherObject retain]; // put the new value in  
    [oldOtherObject release]; // let go of the old object
} // set it

…or this

- (MyOtherObject *) otherObject {  
    return otherObject;
} // get it

屁股完全疼痛,对吧。现在这样做是为了每个伊瓦尔在课堂里。如果你做得不完全正确,就会出现内存泄漏。最好让编译器完成工作。

我看到Number 1没有伊瓦尔。假设这不是一个拼写错误,那没关系,因为 @property / @synthesize 指令也会在幕后为您声明一个 ivar。我相信这对于 Mac OS X - Snow Leopard 和 iOS4 来说是新的。

Number 3没有生成这些访问器,因此您必须自己编写它们。如果您希望访问器方法具有副作用,则可以执行标准内存管理舞蹈,如上所示,然后在访问器方法内执行您需要的任何辅助工作。如果你合成一个属性以及编写自己的, then your版本优先。

我涵盖了所有内容吗?

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

Objective-C中的ivars和properties有什么区别 的相关文章

  • WKWebView不加载https URL?

    我有一个 WKWebView 应该加载以下网址 https buchung salonmeister de place offer details page id 907599 venueId 301655 她是我使用的代码 import
  • 如何在 IOS 中以编程方式滚动 UICollectionViewCell?

    我有一个垂直的UICollectionView每个细胞占据整个self view frame我可以轻松地向上滑动以翻页到下一个单元格 但我想通过按按钮来执行相同的操作 我尝试过使用 void setContentOffset CGPoint
  • UITableViewCell 上的自动布局问题

    我在使用自动布局时遇到问题xcode 5项目 我在内部使用带有导航控制器的普通视图控制器 我有一个MKMapView在上半部分和一个UITableView在下半部分 我在用storyboards 并配置了原型UITableViewCell
  • MPMediaItemPropertyAssetURL 仅针对 iPhone 5s 返回 null

    我一直在使用以下代码从 MPMediaItemPickerController 返回的 MPMediaItem 对象中提取资产 url 以便我可以将音乐文件从用户 iPhone itunes 音乐库复制到文档文件夹进行处理 但在 iPhon
  • 使用 iOS 7 检索设备 WiFi MAC 地址

    我们的应用程序使用设备 WiFi MAC 地址来唯一标识设备 根据苹果文档 https developer apple com news id 8222013a我们将开始使用 UIDevice 的identifierForVendor 属性
  • iPhone OS:从匿名对象获取方法和变量列表

    我正在构建我的第一个 iPhone Obj c 应用程序 并且我有大量的数据保存子类 我将它们传递给引用函数 对于 cite 函数 这些对象是匿名的 我需要找到一种方法来访问每个传递对象的所有变量 我一直在使用预构建的 NSArray 和选
  • 如何通过填充 NSDictionary 以 JSON 格式发送 UIImage

    我正在尝试使用 JSON 将数据发送到服务器 我可以使用我的对象和关键参数创建 NSDictionary 但我想发送我的图片 图片是UIImage NSDictionary mainJSON NSDictionary dictionaryW
  • 使用远程图像创建 MSSticker

    我正在尝试找出使用网络上托管的图像创建 MSStickers 的方法 我可以使用本地图像创建 MSStickers 例如 NSString imagePath NSBundle mainBundle pathForResource imag
  • 如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?

    我尝试了多个 SDK 但无法从任何资源获取电子邮件 ID 我努力了FHSTwitterEngine为此目的 但我没有得到解决方案 FHSTwitterEngine twitterEngine FHSTwitterEngine sharedE
  • 闭包存储属性初始化有什么好处?

    初始化类的属性时 此代码有什么区别以及优点 缺点 1 let menuBar MenuBar let mb MenuBar return mb and 2 let menuBar MenuBar 两个代码片段都声明并初始化存储的属性 htt
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • 生成具有固定数字长度的随机数?

    我正在生成随机数 int randomID arc4random 3000 但我想生成至少 4 位数字的随机数 如 1000 2400 1122 我想知道 Objective C 的代码 请尝试 生成数字 1000 9999 int ran
  • 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

    相关这个问题 https stackoverflow com questions 1082554 我想把数据加载放在后台 但是 我收到 库例程调用不按顺序 错误 In 这个所以线程 https stackoverflow com quest
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • UITableViewCell显示多种字体

    我想在 uitableviewcell 中以类似于 iPhone 地址簿的不同字体显示两个单词 例如 约翰Buchanan 您应该使用两个 UILable 或者您可以使用OH属性标签 https github com AliSoftware
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • iPhone:UIApplication WillResignActiveNotification 从未被调用

    我正在视图控制器中播放视频 当用户按下硬件主页按钮并且当前正在播放视频时 应用程序崩溃并显示EXC BAD ACCESS在模拟器中 我读到我应该使用applicationWillResignActive停止视频播放的消息应该可以解决崩溃问题
  • 如果我使用自定义 UITableViewCell,是否需要设置 heightForRowAtIndexPath?

    如果我使用自定义 UITableViewCell 是否需要设置 heightForRowAtIndexPath 在我的 NIB 中 我已经设置了单元高度 当我覆盖 heightForRowAtIndexPath 时 单元格的内容不会出现 即
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐

  • 获取 cdk-virtual-scroller 中的静态组件引用? (参考文献已回收)

    我们最近将可滚动列表转换为 CDK Virtual Scroller Angular 7 2 12 和 Angular cdk 7 3 7 简而言之 似乎VirtualScrollViewport正在回收组件实例 而不仅仅是文档建议的模板
  • 使用带槽的 Python 描述符

    我希望能够在具有插槽优化的类中使用 python 描述符 class C object slots a a MyDescriptor a def init self val self a val 我遇到的问题是如何实现描述符类 以便能够在调
  • PHP 计算字符串中所有字母的出现次数

    我想计算字符串中所有字母出现的频率 说我有 str cdcdcdcdeeeef 我可以使用 str split 和 array count values 来实现此目的 array count values str split str 想知道
  • ColdFusion 轮函数

    今天我遇到了意想不到的行为或缺乏对 ColdFusion 9 10 11 Round 函数的了解 这是我的场景 Round 28 5 gt 预期结果为 29 Round 0 285 100 gt 结果不是预期的 28Round precis
  • 如何使用图形在多行上输出字符串

    我的程序覆盖public void paint Graphics g int x int y 为了画出一些刺痛g drawString someString x 10 y 30 现在 someString 可能会很长 因此它可能无法放在一行
  • “固定”浮动是什么意思?

    我正在查看 AVX 512 中的指令集 注意到一组fixup指示 一些examples mm512 fixupimm pd mm512 mask fixupimm pd mm512 maskz fixupimm pd mm512 fixup
  • matplotlib 极坐标图刻度/轴标签位置

    我一直在寻找一种方法来可靠地定位极坐标图中的刻度和轴标签 请看下面的例子 import numpy as np import matplotlib pyplot as plt fig plt figure figsize 10 5 ax0
  • jQuery getJSON 不发送 cookie

    我在域 1 中包含 JS 形成域 2 该脚本不会加载 并且在按钮上单击对domain2的JSONP请求 getJSON http www domain2 com process callback function data if data
  • iOS:以编程方式制作屏幕截图最快、最高效的方法是什么?

    在我的 iPad 应用程序中 我想截取占据屏幕大部分的 UIView 的屏幕截图 不幸的是 子视图嵌套得相当深 因此需要很长时间才能制作屏幕截图并在之后为页面卷曲设置动画 有没有比 通常 的方法更快的方法 UIGraphicsBeginIm
  • 序列化未实现可序列化的类变量

    我有一个实现可序列化的类 该类中还有一个类对象没有实现可序列化 应该做什么来序列化类的成员 我的课是这样的 public class Employee implements Serializable private String name
  • 关闭 urllib2 连接

    我正在使用 urllib2 从 ftp 和 http 服务器加载文件 某些服务器仅支持每个 IP 一个连接 问题是 urllib2 不会立即关闭连接 查看示例程序 from urllib2 import urlopen from time
  • 当您使用 flag(Enum) 时,您的限制为 64。当您达到限制时,有什么选择?

    With enum在 net下 您可以使用的最大数字是ULong 这意味着最多有 64 个标志 当您需要超过 64 个标志时 替代方案是什么 Edit 抱歉 我忘了添加这个 仍然可以使用的替代方案按位运算至少有这些 and and or u
  • 如何从 GMSMapView 更改 myLocationButton 位置?

    有人知道如何从 GMSMapView 实例获取 myLocationButton 的实例吗 或者有办法改变默认位置 我只需要把它向上移动一些像素 根据问题跟踪器的说法问题 5864 Bug GMSMapView 填充似乎无法与 AutoLa
  • 无法从类中调用静态方法作为变量名?

    我正在使用 php 5 2 6 我有一个策略模式 并且策略有一个静态方法 在实际实现策略之一的类中 它获取要实例化的策略类的名称 但是 我想在实例化之前调用静态方法之一 如下所示 strNameOfStrategyClass staticM
  • 在 Windows 窗体应用程序中使用 Console.WriteLine

    我有一个外部 DLL 其源代码是 C 从 DLL 的文档中 我确定它使用以下命令将调试消息写入控制台Console WriteLine 我想在 WinForms 应用程序中使用这个 DLL 然而 我发现我看不到 DLL 发出的调试消息 因为
  • 如何更改 Angular Chart.js 上的工具提示

    所以 我正在使用角度图表 js离子应用程序上的插件 不确定是否相关 With linear chart by default when clicking on a dot I get a tooltip as shown 我想更改该工具提示
  • 如何计算正在运行的线程(pthreads)的数量?

    如果我搜索计算应用程序拥有的线程数 所有答案都涉及外部程序 例如top 我想计算应用程序本身内的线程数 我无法在线程创建时添加代码 因为它发生在不可变库内 我无法阅读 proc 它是一个运行在几个不同的 Unice 上的 C pthread
  • 大规模 PHP 数组 vs MySQL 数据库?

    我在脑海中争论是否应该使用大型多维数组或 MySQL 中的数据库 我正在为一家拥有多种产品的客户进行开发 在这个多维数组中 我将包含每个产品的产品标题 描述 图像链接和类别 我的客户可能有 1000 多种产品 我研究了其他类似的问题 其中许
  • Hadoop Yarn 容器未分配足够的空间

    我正在运行 Hadoop 作业 在我的yarn site xml 文件中 我有以下配置
  • Objective-C中的ivars和properties有什么区别

    在 Objective C 中使用 ivars 和属性的这 3 种方式之间的语义差异是什么 1 class MyOtherObject interface MyObject property nonatomic retain MyOther