gpt4 book ai didi

objective-c - 在运行时动态修改 block

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:35 24 4
gpt4 key购买 nike

我正在尝试为 Objective-C 类创建一个基于 block 的良好初始化程序。我在父类(super class)中声明它,我希望它在所有子类中都有用。

现在我有:

+ (id)createWithBlock:(void (^) (id newObject))creationBlock {
id newObject = [self object];
creationBlock(newObject);
return newObject;
}

可以这样使用(在子类中):

Record *newRecord = [Record createWithBlock:^(id newObject) {
Record *newRecord = (Record *)newObject;
newRecord.name = @"Ginger";
newRecord.type = @"Rhizome";
}];

目前还可以,但我希望能稍微精简一下。理想情况下它看起来像:

Record *newRecord = [Record createWithBlock:^{
name = @"Ginger";
type = @"Rhizome";
}];

但这似乎有点雄心勃勃。我也可以:

Record *newRecord = [Record createWithBlock:^(Record *newRecord) {
newRecord.name = @"Ginger";
newRecord.type = @"Rhizome";
}];

最后一个版本很难,因为 clang 似乎对 block 进行了一些编译时类型检查。上面不会用我上面的 createWithBlock: 定义编译,因为:incompatible block pointer types initializing 'void (^)(struct Record *)', expected 'void (^)(struct objc_object *) .

如果它不进行这种强类型检查,我可以在运行时调配这些方法。 (或者如果我对我的 block 声明进行 typedef,我现在可以这样做吗?)

我已经为这个问题绞尽脑汁了一段时间,而且我已经阅读了几乎所有我能找到的关于 block 的文档,包括 clang 规范。如果有人有想法,我很乐意听取他们的意见,这是一个开源项目,我认为该模式将使所有 Objective-C 用户受益。

现在我的想法倾向于imp_implementationWithBlock() .但随后我需要根据其中的内容“构建”一个新的 IMP,然后将其换掉。可行吗?

最佳答案

你用的是什么编译器?我相信最近版本的 LLVM 会接受你给出的最后一个代码示例。 (即你给出的错误不应该发生。)

特别是,这适用于我在 Xcode 4.3.3 中的全新 Xcode 项目中使用 LLVM 3.1。

关于objective-c - 在运行时动态修改 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com