编码一个 int 或 NSInteger 用于状态恢复

Posted

技术标签:

【中文标题】编码一个 int 或 NSInteger 用于状态恢复【英文标题】:encoding either an int or NSInteger for state restoration 【发布时间】:2014-11-07 20:21:56 【问题描述】:

我正在我的应用中实现状态恢复。窗口恢复得很好,所以现在我正在尝试对视图控制器的某些属性进行编码,这些属性与用于保留视图控制器视图状态的索引相关。我有:

@property (nonatomic) int index; //prefer to use an int
@property (nonatomic) NSInteger *testint; //I tried with NSInteger as well and got the same error code

我将以下内容添加到我的视图控制器 .m 文件中(也尝试使用 NSInteger,但我正在粘贴 int 代码)

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder

    [coder encodeObject:self.index forKey:@"self.index"];
    [super encodeRestorableStateWithCoder:coder];


- (void)decodeRestorableStateWithCoder:(NSCoder *)coder

    self.index = [coder decodeObjectForKey:@"self.index"];
    [super decodeRestorableStateWithCoder:coder];

无论我使用 int 还是 NSInteger,我一输入这些信息就会收到相同的错误消息(无法构建)

对于

[coder encodeObject:self.index forKey:@"self.index"];

错误消息是“不兼容的整数到指针转换将'int'发送到类型id的参数。”

对于

self.index = [coder decodeObjectForKey:@"self.index"];

错误是“从'id'分配给'int'的整数转换指针不兼容”

显然,这些错误是其中之一。但是必须有一种方法来编码一个 int,即使没有,为什么即使我使用 NSInteger test int 并将上述所有内容替换为 self.testint 而不是 self.index,我也会得到这些错误。在后一种情况下,我使用的是指针。

所以我的问题是如何编码 int(首选)或 NSInteger?谢谢你。

【问题讨论】:

您是否考虑查看相关pieces of the documentation 的either? 感谢您的链接。我还没有找到关于编码 c 数据类型的那个。很有帮助。 【参考方案1】:

你真的想使用整数'*testint'的指针吗?我认为它是'testint'。 以下内容可以解决您的错误。

@property (nonatomic) int index; //prefer to use an int
@property (nonatomic) NSInteger testint; //I tried with NSInteger as well and got the same error code

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder

    [coder encodeInt:self.index forKey:@"self.index"];
    [super encodeRestorableStateWithCoder:coder];


- (void)decodeRestorableStateWithCoder:(NSCoder *)coder

    self.index = [coder decodeIntForKey:@"self.index"];
    [super decodeRestorableStateWithCoder:coder];

【讨论】:

所以实际上您需要从上面建议的代码中删除 [super] 以进行编码和解码。如果您保留 [super... 命令,整数不会解码为正确的值。我不知道为什么(在文档中没有找到原因,但是作为其他新手的负责人。

以上是关于编码一个 int 或 NSInteger 用于状态恢复的主要内容,如果未能解决你的问题,请参考以下文章

ios - 从整数(int 或 NSInteger)到 UICollectionView 的 NSIndexPath*

C中的int和OC中的NSInteger区别

NSUInteger vs NSInteger,int vs unsigned,以及类似情况

不兼容的整数到指针的转换将“NSInteger”(又名“int”)发送到“NSInteger *”(又名“int *”)类型的参数

目标c:检查整数/整数/数字

将 int64_t 转换为 NSInteger