在 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 属性 的相关文章

  • PresentModalViewController 上的内存泄漏

    我正在打开相机供用户拍照 当我拍照并按下 使用 按钮时 我不断出现内存泄漏 selfpresentModalViewController imagePickeranimated YES 完整代码 imagePicker UIImagePic
  • 在特定点停止 CABasicAnimation

    我正在使用创建的旋转动画CABasicAnimation 它旋转一个UIView超过2秒 但我需要能够阻止它UIView被感动了 如果我删除动画 视图将处于与动画开始之前相同的位置 这是我的动画代码 float duration 2 0 f
  • iOS 中tableview 的动态搜索

    I ve a tableview和我实现搜索方法的文本字段 现在 当我在其中写入一些值时textfield然后点击搜索按钮 然后在tableview 但是 我希望它是动态的 意味着我开始输入的那一刻textfield它应该开始搜索而不点击任
  • 增加uitableviewcell高度同时增加内部UITextView

    我创建一个UITableView与不同类型的UITableViewCell取决于要显示的内容类型 其中之一是UITableViewCell里面有一个UITextView以这种方式以编程方式创建 UITableViewCell tableVi
  • NSData initWithBytesNoCopy:length:freeWhenDone 的行为:

    我想要一个固定长度的可变内容共享数据缓冲区 这就是我如何创建它 void buffer malloc length initialize buffer content NSData sharedData NSData alloc initW
  • 显示键盘时 Admob 广告不会出现在 UITableView 页脚中

    我用它在 UITableView 的页脚上显示 Admob 广告 UIView tableView UITableView tableView viewForFooterInSection NSInteger section GADBann
  • 清除绘图的UIView?

    我正在使用 UIView 的子类来绘制 这个子类视图用于在视图控制器上获取您的签名 有一个清除按钮应该可以清除 UIView 但它不起作用 这是我尝试过的 子类 h implementation subclassed uiview UIBe
  • ASIHTTP:上传 UIImage?

    有人可以告诉我如何在 Objective c 中使用 ASIHTTPRequest 对象上传 UIImage 对象吗 我需要将其转换为 NSData 对象吗 这是头像上传网址 E g UIImage toUpload UIImage ima
  • iPhone OpenGLES 2.0 文本纹理带有奇怪的边框(不是笔划)问题

    我正在使用 CoreGraphcis 创建文本纹理 不幸的是 文本呈现如下 文本颜色与背景相同以展示奇怪的边框 我尝试过使用描边颜色和边框 我认为这是针对 OpenGLES 2 0 而不是 CoreGraphics Create defau
  • 使用其他应用程序打开 pdf

    我正在应用程序中显示 pdf 文件 我想在 nag bar 上显示 打开方式 选项 显示 iPhone 上安装的可以打开相同 pdf 的应用程序 如果用户选择任何应用程序 例如 pdf 查看器 则应该使用 pdf 查看器应用程序打开 pdf
  • 延迟推送通知并检查用户是否启用它

    我开发了一个应用程序 它围绕推送通知构建 仅当用户达到注册过程的某个阶段时 应用程序才会请求通知权限 我已经设法做到了以下几点 该应用程序维护一个NSUserDefaults变量 指示是否需要在启动时注册推送 默认情况 不需要 当注册达到该
  • iOS 7 Core 蓝牙外设在后台运行

    我想要的是我的 iOS 设备始终宣传蓝牙 LE 服务 即使应用程序未运行 这样我就可以让另一台 iOS 设备扫描并找到它 我在这里遵循了苹果的后台说明 https developer apple com library ios docume
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • 使用自动布局以编程方式添加视图会出现“NSGenericException”,原因:“无法在视图上安装约束”

    我使用添加一个视图作为子视图 self view addSubview myView 这在纵向模式下效果很好 然而 它在风景中根本不起作用 如何以编程方式添加布局约束 我的视图当前看起来像纵向矩形 我需要它在横向模式下看起来像横向矩形 我尝
  • UICollectionView cellForItemAtIndexPath 未注册单元格

    我正在尝试使用UICollectionViewCell 因为我想显示的只是一张图像 我可以使用将图像添加到单元格中UIColor colorWithImage on the UICollectionViewCell s contentVie
  • NSTokenField:标记的不同颜色

    我在我的 xib 中创建了一个 NSTokenField 我想在 tokenField 中显示不同颜色的令牌 含义 一些标记将是蓝色的 其余的将是红色的 根据其内容 那可能吗 以下代码对我不起作用 我希望有人能帮助我 id tokenFie
  • 视频轨道后面的AVFoundation UIImage

    我当前正在渲染一个小于输出大小的视频轨道 该视频轨道工作正常 我想将 UIImage 绘制到背景中 以便视频位于顶部 而图像则显示在视频不存在的区域中 我尝试使用 CoreAnimation Layers 和 videoCompositio
  • 制作我自己的UIControlEvent,并触发它?

    我在视图控制器中创建了一个自定义的 UIView 类 我想让这个类可重用 所以不想将其构建为仅与这 1 个视图控制器一起使用 正因为如此 我think告诉我的视图控制器用户已与该类交互的最好方法是以某种方式创建我自己的 UIControlE
  • Objective-C字典是一个有序的容器吗?

    如标题所示 当我将元素插入到 Objective C 中的字典中 按顺序 k1 k2 k3 时 是否有任何保证 当我像这样枚举它时 for k in dictionary output the k value 它会以相同的顺序显示吗 No
  • 在 Interface Builder 中添加背景图像

    我正在尝试使用 Xcode 4 2 添加自定义图像作为我的应用程序的背景 但我不太确定该怎么做 我可以在 Interface Builder 中添加纯色作为背景 但我没有看到添加自定义图像的选项 我在谷歌上搜索了这个问题并研究了几个小时 但

随机推荐

  • 库未在 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