按名称调用属性设置器的最佳方法是什么?

2024-02-08

我正在构建一个通用 UI,它可以连接到一系列底层对象属性,因此我想按名称调用 getter 和 setter。我尝试过使用 NSInspiration,也看到其他人使用setValue:forKey。但我想用最快的方法。

如果我保留对 NSInitation 实例的引用,我可以非常快速地调用 invoke,但我有一个问题 - 如何使用它调用属性设置器?它在 getter 上效果很好,如下所示:

SEL propSelector = NSSelectorFromString(propertyName);
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[target class]instanceMethodSignatureForSelector:propSelector]];
[inv setSelector:propSelector];
[inv setTarget:target];
[inv invoke];
float value;
[inv getReturnValue:&value];

但我一直无法找到一种方法来为选择器赋值。使用setArgument:atIndex:似乎不起作用。

所以,我又回到了setValue:forKey:方法,但我担心随着时间的推移性能会迅速下降。

有任何想法吗?


我不太明白你想要实现什么,但我很快测试了性能valueForKey:与您的调用方法相比。在我的测试中,代码如下,valueForKey:几乎比 NSInitation 方法快 5 倍。

  1. 1.620685 毫秒
  2. 30.357355 毫秒
  3. 7.593611 毫秒

Code:

#import <Foundation/Foundation.h>
#include <mach/mach_time.h>


@interface Foo : NSObject
{
    NSNumber *value;
}

@property (nonatomic, retain) NSNumber *value;

@end

@implementation Foo

@synthesize value;

- (void) dealloc
{
    [value release];
    [super dealloc];
}

@end

#pragma mark MAIN
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // prepare loops
    NSUInteger i;
    NSUInteger max = 10000;
    Foo *target = [[[Foo alloc] init] autorelease];
    target.value = [NSNumber numberWithFloat:12.345f];
    NSString *valueKey = @"value";

    // prepare mach timebase
    mach_timebase_info_data_t timebase;
    mach_timebase_info(&timebase);
    double ticksToNanoseconds = (double)timebase.numer / timebase.denom;

    // old-fashioned
    uint64_t startTime = mach_absolute_time();
    for (i = 0; i < max; i++) {
        NSNumber *numValue = [target valueForKey:valueKey];
    }
    uint64_t elapsedTime = mach_absolute_time() - startTime;
    double elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds;
    NSLog(@"1: %f millisec", elapsedTimeInNanoseconds / 1000000);

    // invocation
    startTime = mach_absolute_time();
    for (i = 0; i < max; i++) {
        SEL propSelector = NSSelectorFromString(valueKey);
        NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:propSelector]];
        [inv setSelector:propSelector];
        [inv setTarget:target];
        [inv invoke];
        NSNumber *numValue;
        [inv getReturnValue:&numValue];
    }
    elapsedTime = mach_absolute_time() - startTime;
    elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds;
    NSLog(@"2: %f millisec", elapsedTimeInNanoseconds / 1000000);

    // reused invocation
    SEL propSelector = NSSelectorFromString(valueKey);
    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[target class] instanceMethodSignatureForSelector:propSelector]];

    startTime = mach_absolute_time();
    for (i = 0; i < max; i++) {
        [inv setSelector:propSelector];
        [inv setTarget:target];
        [inv invoke];
        NSNumber *numValue;
        [inv getReturnValue:&numValue];
    }
    elapsedTime = mach_absolute_time() - startTime;
    elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds;
    NSLog(@"3: %f millisec", elapsedTimeInNanoseconds / 1000000);

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

按名称调用属性设置器的最佳方法是什么? 的相关文章

  • kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 帧到 UIImage 转换

    我有一个应用程序可以捕获 kCVPixelFormatType 420YpCbCr8BiPlanarFullRange 格式的实时视频来处理 Y 通道 根据苹果的文档 kCVPixelFormatType 420YpCbCr8BiPlana
  • 继承属性,从 readonly 继承的属性中读写时不会合成 setter

    我在使用属性时发现了一个奇怪的行为 该属性被继承为只读 然后在继承的类中重新声明为读写 In A h interface A NSObject property nonatomic strong readonly NSObject some
  • 有没有办法直观地看到精灵套件的 SKPhysicsbody 边界线?

    我在用bodyWithPolygonFromPath定义物理体的体积 我使用http dazchong com spritekit http dazchong com spritekit 获取所需的路径 但路径似乎不正确 我希望查看物理体路
  • Siri - 联系人搜索行为类似于 Skype 的音频通话

    我正在实现一个 VoIP 应用程序 我需要通过 Siri 发起呼叫 我能够通过 Siri 发起呼叫 但问题是 每次启动应用程序时 尽管联系人不在应用程序的联系人列表中 我不知道如何以及在哪里处理这个问题 我的意思是 如果应用程序没有像 Sk
  • 有 Objective-C Web 框架吗?

    有 Objective C Web 框架吗 我发现的唯一框架是 frothkit 我主要寻找一种在 Objective C 中编写 RESTful json Web 服务的方法 GNUStepWeb http wiki gnustep or
  • UIView表面自定义变换/动画(如“水滴效果”)

    实施方式是什么自定义转换 动画 在视图表面 类似于所附图片 not只是视图边界 问题主要在于一般的方法是什么做到这一点 不完全是 水滴效应 但任何例子肯定会受到赞赏 我想 这是层布局 网格 的某种 算法 转换 但不确定以哪种方式 挖掘 它
  • AutoLayout 将 UILabel 高度设置为零

    我有一个UILabel对于其他视图中的项目描述 所有内容均使用 Interface Builder 中的约束进行布局 您可以在下图中看到所有相关约束 行数也设置为0 我没有设置高度限制 因为我想要UILabel根据其包含的文本调整大小 相反
  • 如何读取 IBAction 中的 UITextField 值。我正在以编程方式创建 UITextField

    我怎样才能阅读UITextField值在IBAction 我正在创造UITextField以编程方式 所以我无法设置 property and synthesize使用 Xcode 要生成的代码UITextField如下 for i 0 i
  • 如何处理 iPhone 屏幕尺寸/背景图像分辨率

    在 iPhoneX 之后 我真的很纠结于支持所有设备的图像尺寸和命名约定 有没有办法在 4 7 5 5 和 5 8 屏幕上使用 3x 图像 全屏图像视图应该使用的确切尺寸是多少 您可以使用图像 pdf格式 因此您只需要管理 1x 的单比例图
  • 如何将 UIImage 添加到分组的 UITableViewCell 中,使其圆角?

    我正在尝试将图像添加到分组 UITableView 中的表格单元格 但图像的角未被剪裁 剪切这些内容的最佳方法是什么 除了在 Photoshop 中剪切它们之外 表格内容是动态的 例如 表格中的第一张图像只需将左上角圆角化即可 这是我的解决
  • 如何构建 Objective-C 静态库? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些 Objective C 类 目前在 Cocoa 应用程序 Mac OS X 和 Cocoa Touch 应用程序 iOS 中
  • iOS 低内存崩溃,但内存使用率非常低

    这已经困扰我很长时间了 我的应用程序运行占用大约 2 74MB 内存 没关系 但当它创建 UIWebView 时 它会增加到大约 5 87MB 并继续崩溃 这些是在我的第一代 iPad 上运行时仪器中的实时字节下给出的值 我找不到崩溃日志
  • UICollectionView 设置列数

    我刚刚开始学习 UICollectionViews 我想知道是否有人知道如何指定集合视图中的列数 默认设置为 3 iPhone 肖像 我查看了文档 似乎找不到简洁的答案 对于 Swift 5 和 iOS 12 3 您可以使用4 以下实现为了
  • NSString 对象的最大长度是多少?

    NSString 对象中可以保存的最大字符串大小是多少 这会动态变化吗 我假设 NSString 的硬限制是 NSUIntegerMax 个字符 因为 NSString 的索引和大小相关的方法返回 NSUInteger 由于当前能够运行 i
  • 为什么 Apple 建议以编程方式创建模态导航控制器?

    以模态方式呈现导航控制器时 以编程方式创建和配置导航控制器对象通常更简单 虽然您也可以使用 Interface Builder 来执行此操作 但通常不建议这样做 事实上 因为我的导航控制器很简单 我宁愿在IB中自定义视图 虽然我不知道确切的
  • “无法取消归档名为 UITableViewController 的元素”

    我一直在按照 构建你的第二个 iOS 应用程序 教程一步步进行 在教程承诺所有错误都会消失之后 我遇到了这个错误 但直到其他错误都出现后 该错误才出现 全部更正 我尝试编译它 错误 The document MainStoryboard i
  • 如何将设备上未保存的图片上传到dropbox帐户?(IOS)

    Dropbox RestClient 仅保存文件 所以我想先将图像保存在本地文件夹中 然后上传它 结果它保存了文件 但它已损坏 NSString localPath NSBundle mainBundle pathForResource I
  • 4.4 中新的 Objective-c 文字

    我可以写 42 这会创建一个NSNumber with int值 42 我可以用变量来做到这一点 例如 someIntVar 显然我尝试过但它不起作用 这很糟糕 因为然后我必须经历 NSNumber numberWithInt someIn
  • MIDI 文件解析

    我们如何使用 Objective C 进行 MIDI 文件解析 在Java中用于MIDI文件解析的包名为javax sound midi Objective c 有什么东西吗 如果你们中有人回复的话将会有很大的帮助 提前致谢 您可以使用 C
  • 快速从 appDelegate 中 popToRootViewController

    我试图从应用程序委托弹出到导航堆栈的根视图控制器 并且在将 obj c 中的内容转换为 swift 时遇到一些问题 obj c 中的工作原理 UINavigationController navigationController UINav

随机推荐