在 Objective c 中公开/综合 iVar 属性

2023-12-11

我有一个类,它本质上充当另一个类的轻量级包装类。它将另一个类保存为 iVar。我希望能够公开 iVar 的某些属性(实际上相当多),但要做到这一点,我必须像这样写出每个属性访问器:

- (void) setProperty:(Class *)value{
    _iVar.property = value;
}
- (Class *) property{
    return  _iVar.property;
}

当然,我必须对每个属性都执行此操作,这很痛苦(大约有 30 个)。我很想能够合成这个,但我一直不知道如何合成。

可以合成吗?

另外,我不能子类化......好吧,我也许可以,但真的不推荐。 iVar 类确实相当重(它实现了 CoreText)。我宁愿手工写出这些方法。


好的,这就是我找到的解决方案......一旦您知道该怎么做,结果就会变得非常简单。首先覆盖 '- (id)forwardingTargetForSelector:(SEL)aSelector' 并返回 iVar:

- (id) forwardingTargetForSelector:(SEL)aSelector{
    return iVar;
}

当运行时正在寻找一个方法但找不到时,它将调用该方法来查看是否有另一个对象可以将消息转发到。请注意,此方法通常返回 nil,如果您在此处返回 nil,您的程序将崩溃(这是适当的行为)。

问题的第二部分是当您尝试发送未声明的消息时关闭编译器错误/警告。通过声明您未实现的类别可以轻松完成此操作。

@interface Class (iVarClassMethods)
@propoperty (strong) Class *property1;
......more properties
@end

只要你不在任何地方实施,又名@implementation Class (category),编译器不会抱怨(它会假设实现是某处....).

现在我看到的唯一缺点是,如果您更改 iVar 类接口中的任何属性,您需要确保更新使用上述方法的所有其他类,否则当另一个类尝试发送时您会崩溃现在什么是错误的方法(编译器不会提前警告你)。然而,这can被绕过。您可以在类别中声明协议。因此,您可以为 iVar 类创建一个单独的协议,并将所需的方法/属性从 iVar 类移至该协议中。

@protocol iVarClassProtocol
@propoperty (strong) Class *property1;
......more properties
@end

将该协议添加到 iVar 子类中,以便它现在具有通过协议声明的这些方法。

@interface iVarClass <iVarClassProtocol>
....other methods/properties you don't need forwarded
@end

最后,只需将协议添加到类别中即可。因此,您将拥有以下内容,而不是前面提到的带有显式声明的类别:

@interface Class (iVarClassMethods) <iVarClassProtocol>
@end

现在,如果您需要更改任何要转发的属性/方法,您可以在协议中更改它们。当您尝试向转发类发送错误的方法时,编译器会警告您。

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

在 Objective c 中公开/综合 iVar 属性 的相关文章

  • 如何从 Class - Swift 实现序列化 NSDictionary

    在 Objective C 中 我使用以下代码将自定义类序列化为工作正常的字典 为了熟悉Swift 将Objective C代码移植到Swift 但是我无法实现这一点 我该如何用 Swift 实现这一点呢 这就是我用 Objective C
  • NSTextField:当用户单击文本字段之外时结束编辑

    我有一个NSTextField我根据用户操作设置可编辑 我想在用户单击窗口内文本字段之外的任何位置时结束编辑 看起来很简单 但我无法让它发挥作用 我实施了controlTextDidEndEditing and textDidEndEdit
  • UITableView框架改变动画问题

    我用谷歌搜索了很多这个问题 但似乎没有答案 所以我希望你们中的一些人知道如何处理这个问题 我有一个具有 tableview 的视图控制器 当我用动画更改视图框架时 一切都很顺利 除了一种特殊情况 当 tableview 的项目多于屏幕大小时
  • iOS - 单元测试异步代码

    我试图测试的方法部分如下 void configureTableFooterView dispatch async dispatch get main queue self tableView tableFooterView nil if
  • UIImage initWithContentsOfFile 不起作用

    我有问题 我想避免 UIImage imageNamed 所以我做了 UIImage prodImg UIImage alloc initWithContentsOfFile myimage png controller productIm
  • iOS - 自动调整 CVPixelBufferRef 的大小

    我正在尝试裁剪和缩放CMSampleBufferRef基于用户的输入 基于ratio 下面的代码采用 CMSampleBufferRef 将其转换为 CVImageBufferRef 并使用 CVPixelBuffer 根据其字节裁剪内部图
  • 没有这样的模块“Ensembles”错误 - 导入 Objective-C 框架以在 swift 项目中使用

    我将 Ensembles 添加到我的 Swift 项目 在这里找到https github com drewmccormack ensembles https github com drewmccormack ensembles 我没能在我
  • 为什么 Obj-C 属性默认所有权“分配”而不是“强”

    我正在向旧项目添加 Swift 类 一切进展顺利 直到我尝试向 Swift 类添加属性 生成的标头无法编译 我认为问题是 在生成的代码中 Swift 省略了strong所有权并仅将其声明为nonatomic 这通常应该足够了 因为 prop
  • 导出 iPhone 地址簿数据库的可能方法

    我想将 Phone s Address Book sqlite db 导出到我的 iPhone 应用程序中 我在网上搜索过 但一切似乎都在 ABAddressBook 上迭代 但我想知道是否可以以编程方式将 Phone s Address
  • 在 xcode 中使用线程调用函数

    我在 xcode 中创建了一个线程 并且给出了从该线程调用的函数名称 但我的问题是 给 call 的函数名称没有被调用 知道何时在该函数中放置断点 code NSThread myThread myThread start self per
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • 循环缓冲区录音 iOS:可能吗?

    我的一个客户想要连续录制音频 当他单击 提交 时 他只想提交最后 10 秒的内容 所以他想要连续记录并且只保留最后 x 秒 我认为这需要类似循环缓冲区的东西 但是 作为 iOS 的新手 它看起来像AVAudioRecorder只能写入文件
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • 创建类似于邮件应用程序菜单的 iPhone 弹出菜单

    当您想要回复消息时 我想创建一个类似于邮件应用程序中的弹出菜单 我在多个应用程序中看到过这一点 所以我不确定框架中是否内置了某些内容或一些示例代码 在 Swift 中创建操作表 代码已使用 Swift 5 进行测试 从 iOS 8 开始 U
  • NSHTTPCookieStorage 是否跨应用程序持续存在?

    所以我只是好奇 NSHTTPCookieStorage 是否跨应用程序持久存在 或者仅在当前应用程序本地 我希望在另一个应用程序中收集的一些 cookie 可以在搜索应用程序中访问 是这样的吗 谢谢 PS 这是在 iPhone 或 iPad
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 在 iOS 上将 NSString 转换为 NSDate 的正确方法?

    我一直在使用此方法将常规 NSString 对象转换为 NSDate 但尝试向 Apple 提交更新 但遭到拒绝 在 iOS 中还有什么其他方法可以做到这一点 NSString date str 2011 08 12T12 20 00Z N
  • 覆盖层不与 UITableView 一起滚动 - iOS

    我有一个 UITableView 类 它使用以下方法在转到下一个屏幕时调用加载覆盖 问题是这个加载屏幕不随列表滚动 所以如果你滚动一点并单击某些东西 加载屏幕不会显示 因为它位于顶部 如何让加载屏幕始终保持在 UITableView 的顶部

随机推荐

  • 库未在 Python 中初始化(pygame)

    所以我有一个在类函数中创建的字体 我在代码中多次调用这个函数并且它运行得很好 但是有一次当我调用它时它说 self font pygame font Font None self text size RuntimeError Library
  • UWP 项目中的条件包引用

    我想使用一个 NuGet 包仅用于调试配置 我found如果我有一个针对 Creators Update 15063 的 UWP 项目 则可以在 Visual Studio 2017 中执行此操作
  • Odoo 规则实际上运行正常吗?

    我的目的 我试图使用安全规则来实现以下目的 我需要在用户模型中添加一个字段 该字段将设置每个用户可以修改哪些仓库 这是因为我想隐藏您不允许看到的库存变动 其他仓库的库存变动 我做了什么 我创建了一个多对多字段命名allowed wareho
  • Bootstrap 工具提示不起作用

    我在这里要疯了 我有以下 HTML a href title A nice tooltip test a 而且Bootstrap风格的工具提示拒绝显示 只是一个普通的工具提示 我的 bootstrap css 工作得很好 我可以看到其中的类
  • c++11 如何实现`std::string ToString(std::tuple &t)`?

    我想要一个非常友好的ToString许多类型的函数 包括std tuple 函数是这样的 template
  • 绘制 100% 堆叠图问题

    我得到了一个数据框 df5 其中包含我从 read csv 读取的下表 Week Days Category Total Products Sold Total Profit 0 Monday A 3221 9999 53 0 Monday
  • 32 位 .NET 最大字节数组大小是否 < 2GB?

    我一直在研究一些与字节数组的最大大小相关的问题 here and here 并一直在玩一些数组并得到一些我不太明白的结果 我的代码如下 byte myByteArr byte myByteArr2 new byte 671084476 fo
  • 多个 WebClient 不工作?

    我正在尝试使用三个单独的 WebClient 下载三个文件 我用这个 void client1 OpenReadCompleted object sender OpenReadCompletedEventArgs e MessageBox
  • 如何搜索哈希表?

    我刚刚开始学习哈希表 我了解如何插入但不知道如何搜索 这些是我将基于这个问题的算法 散列密钥 int Hash int key return key 10 table has a max size of 10 用于解决碰撞的线性探测 假设我
  • 在 Laravel 中显示输入数组的验证错误

    我正在向我的控制器提交一组输入 如下所示
  • 使用 JsonObjectRequest 和 GET 请求发送 JSON 正文

    我需要通过 get 方法发送 json 代码 我尝试通过 JsonObjectRequest 发送方法 url 和参数 响应为 null 并且未发送 json JSONObject request new JSONObject try re
  • Hibernate 查询中的 Unicode 字符串

    在 SQL 中 我们可以编写一个查询来搜索人名 如下所示 SELECT FROM Person P WHERE P Name LIKE N ike 该查询将使用 unicode 字符运行 假设名称列和数据库设置为处理 unicode 支持
  • SubprocVecEnv 无法与自定义环境一起使用(稳定基线 - 健身房)

    我使用gym Env作为父类创建了一个自定义环境 并且一切都可以很好地运行单核 我已经开始代码如下 class MyEnv gym Env 但是 如果我尝试使用 SubprocVecEnv 使用所有 24 个 CPU 核心来加速学习过程 我
  • 简单的媒体播放器从文件路径播放mp3?

    我有一个非常简单的播放背景的媒体播放器 它从 apk 调用文件 但我希望它可以从任何目录播放 例如音乐或 SD 卡 这是我的代码 private MediaPlayer mpintro mpintro MediaPlayer create
  • 如何在后台线程上每秒执行一个方法,这样就不会影响应用程序的性能

    我尝试每 30 秒访问一次数据库 但是 每当该方法执行时 我都可以清楚地看到应用程序的性能下降 到目前为止 这是我当前的代码 var timer Timer override func viewDidLoad super viewDidLo
  • dart 中 Paper 元素的实例

    我怎样才能获得一个实例paper input下面的元素 HTML 文件
  • Delphi - 智能指针和泛型 TList

    我有一个智能指针的实现 并且我尝试在通用 TList 上实现它 program Project2 APPTYPE CONSOLE R res uses System SysUtils System Generics Collections
  • 带有 NSAttributedString 的 Cell 使 UITableView 的滚动变慢

    我有一个包含多种单元格的表视图 其中之一是带有 TextView 的单元格 在这个文本视图中 我必须渲染一个NSAttributedString从数据来看 这必须在主线程上完成 根据苹果文档 不应从后台线程调用 HTML 导入器 即选项字典
  • 使用 exec Laravel PHP 运行 .sh 文件

    我正在尝试运行一个 sh 文件 将 Excel 文件导入到我的数据库中 这两个文件位于公共文件夹内的同一目录中 由于某种原因 exec 命令没有被执行 或者没有发生任何错误 sh 文件冷 IFS while read column1 do
  • 在 Objective c 中公开/综合 iVar 属性

    我有一个类 它本质上充当另一个类的轻量级包装类 它将另一个类保存为 iVar 我希望能够公开 iVar 的某些属性 实际上相当多 但要做到这一点 我必须像这样写出每个属性访问器 void setProperty Class value iV