编码Objective-c块?

reb*_*ebo 17 objective-c nscoding objective-c-blocks

是否可以使用?编码Objective-C块NSKeyedArchiver

我不认为Block对象是NSCoding-compliant,因此[coder encodeObject:block forKey:@"block"]不起作用?

有任何想法吗?

bbu*_*bum 19

不,由于各种原因,这是不可能的.块中包含的数据不以任何方式表示,例如,实例变量.没有州的清单,因此无法为归档目的列举州.

相反,我建议你创建一个简单的类来保存你的数据,其实例在处理过程中携带块所使用的状态,并且可以很容易地存档.

你可能会发现这个问题的答案很有趣.这是相关的.


要扩展,请说你有一个类:

@interface MyData:NSObject
{
    ... ivars representing work to be done in block
}

- (void) doYourMagicMan;
@end
Run Code Online (Sandbox Code Playgroud)

然后你可以:

MyData *myWorkUnit = [MyData new];

... set up myWorkUnit here ...

[something doSomethingWithBlockCallback: ^{ [myWorkUnit doYourMagicMan]; }];

[myWorkUnit release]; // the block will retain it (callback *must* Block_copy() the block)
Run Code Online (Sandbox Code Playgroud)

从那里,您可以在MyData上实现归档,保存它等等......关键是将Block视为执行计算的触发器,并将所述计算和计算的必要状态封装到MyData类的实例中.

  • @alexgray大量的对象可以是无法归档/取消归档的实例变量(每个不支持NSCopying的类).什么甚至意味着一个块可以存档?是否所有捕获的对象都可以存档?如果它捕获随机结构怎么办?还要存档吗?那么架构/字节序依赖呢?这些由归档API自动处理.然后块会增加实现自定义归档的能力吗?除了成为维护的噩梦之外,在套件中支持起来非常困难(投资回报率很低). (3认同)