NSString 属性是复制还是只读?

2024-02-06

我看到很多讨论说我应该使用copyNSString 属性,因为它会阻止其他人在我背后更改它。但那我们为什么不直接设置readonly财产呢?

Update

谢谢回答我的问题。但问题是,对于 NSString 属性,你总是不希望别人修改它,对吧?你可以自己修改,但绝对不能让别人修改。我想大多数时候 NSString 都会设置它的初始值(由你或其他人设置),之后只有你会修改它。那为什么不直接使用 readonly 属性

其实我大部分时间都用copy。但后来我意识到大多数时候我只在 init 方法中使用这些设置器。所以我认为对于这些情况我应该使用只读而不是复制。

所以让我这样问一个问题:如果你只在 init 方法中为 NSString 使用这些 setter,那么你应该使用 readonly。这是一个合理的结论吗?


如果您只在 init 方法中为 NSString 使用这些 setter,那么您应该使用 readonly。这是一个合理的结论吗?

因为您不应该在部分构造的状态下使用访问器(init/dealloc),那么你应该将其声明为copy and readonly,然后在初始化器中执行复制:

- (id)initWithName:(NSString *)inName
{
  self = [super init];
  if (0 != self) {
    name = [inName copy];
  }
  return self;
}

更详细地说,copy and readonly是语义上不同的概念。

  • You use copy因为在大多数情况下您对价值感兴趣。使用不可变字符串也是一种保障和优化。

  • You use readonly禁止客户更改/设置您的数据。

它们一起提供了很好的安全性,但单独使用时:

  • copy仍然允许客户端通过设置器在程序执行的任何时刻设置该值。

  • readonly并不意味着copy,并且保留的财产可能会在您背后改变;考虑一下当您传递一个可变变体并且客户端在调用 setter 后对其进行变异时会发生什么。

最安全的方法是使用copy and readonly.

  • 显然,你会使用readwrite当您需要为客户提供设置者并且您支持这种更改时。

  • 保留字符串(或数组,或...)而不是复制通常是一个坏主意。不复制这些类型几乎没有什么好处,而且可能会导致微妙的错误。即使您正在处理可变类型,您通常也需要一个可变副本(编译器不会为您合成)。保留或分配这些类型几乎从来都不是您想要的。我犯的一个例外是在处理大量分配时,其中数据封装得很好(例如,一个重的分配)NSMutableData例如,我将所有权从一个地方传递到另一个地方以避免复制)。

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

NSString 属性是复制还是只读? 的相关文章

  • ios 如何存储用户输入的详细信息并取回?

    How to Store用户输入的详细信息和Get it Back在ios中 我有以下关注TextFields UserName Email Re enter Email id Phone State Address Localityand
  • 观察 UIDatePicker 的变化

    我注意到没有委托来观察 UIDatePicker 中的变化 有没有一种方法可以在不确认任何内容的情况下检测选择器中何时进行更改 例如它旋转并落在新数字上的那一刻 我希望能够检测到这一点 我考虑过关键值观察 但我不认为有一个属性会立即改变 您
  • 如何合并非常大的 numpy 数组?

    我会有很多Numpy https docs scipy org doc numpy 1 14 0 reference arrays https docs scipy org doc numpy 1 14 0 reference arrays
  • 多维数组 (C++)

    我正在尝试将指针存储在数组中 我指向类对象的指针是 classType ClassObject 所以我知道我可以使用 new 运算符来分配它 如下所示 ClassObject new classType 100 我正在阅读一个带有标点符号的
  • 如何将 NSString 值 @"3.45" 转换为浮点数?

    如何将 NSString 值 3 45 转换为浮点数 3 45 float fCost NSDecimalNumber decimalNumberWithString 3 45 floatValue NSString val 3 45 fl
  • 管理一堆具有依赖关系的 NSOperation

    我正在开发一个创建内容并将其发送到现有后端的应用程序 内容是标题 图片和位置 没有什么花哨 后端有点复杂 所以这是我必须做的 让用户拍照 输入标题并授权地图使用其位置 为帖子生成唯一标识符 在后台创建帖子 上传图片 刷新用户界面 我使用了几
  • didReceiveRemoteNotification 将用户带到正确的视图

    我有一个聊天应用程序 当发送新消息时 我的服务器会发送推送通知 我遇到的问题是如何将用户带到正确的视图 我正在发送一个channelID在推送通知中 但我如何检索它并将用户带入实际对话 我使用此代码来检测何时单击推送通知 void appl
  • PAE(物理地址扩展)如何实现大于4GB的地址空间?

    维基百科文章的摘录物理地址扩展 http en wikipedia org wiki Physical Address Extension x86 处理器硬件架构通过用于选择附加内存的附加地址线进行了增强 因此物理地址大小从 32 位增加到
  • 将UIWebView显示的PDF保存到本地

    我有一个UIViewController与UIWebView显示一个 pdf 文件 具体取决于之前单击的行UITableView 现在我想添加一个按钮 供用户在本地保存此 pdf 文件以供离线使用 然后还有第二个UITableView它应该
  • 使用自动布局时 UIScrollview 的中心内容

    我在项目中使用自动布局 并且有一个滚动视图 其中有一个居中的按钮 我已经让滚动视图滚动 但不占据整个屏幕 我尝试按照此处的教程进行操作 https developer apple com library ios technotes tn21
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • 自定义 UITableViewCell 错误

    我收到此错误 Terminating app due to uncaught exception NSUnknownKeyException reason
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • Xcode 中的 NSObject 描述和自定义摘要

    我覆盖对象的 NSString description但是 Xcode 总是显示error summary string parsing error在变量视图的摘要字段中 我当前的实现如下 NSString description retu
  • UIImageWriteToSavedPhotosAlbum 选择器语法问题

    努力让 UIImageWriteToSavedPhotosAlbum 快速工作https developer apple com library ios documentation UIKit Reference UIKitFunction
  • 播放循环声音的最简单方法是什么?

    在 iPhone 应用程序中播放循环声音的最简单方法是什么 可能最简单的解决方案是使用AVA音频播放器 http developer apple com library ios DOCUMENTATION AVFoundation Refe
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代
  • 构建 iOS 应用程序后退出代码 1 错误

    我正在尝试使用 RestKit 构建我的项目 当我构建它时 我收到以下错误 我尝试使用 Apple LLVM 3 0 和 LLVM GCC 4 2 进行编译 两者都产生相同的结果 任何人有任何想法是什么导致了这个问题 Ld Users Ji

随机推荐