- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 sqlite 查询实现 NSFastEnumeration 协议(protocol)。
我遇到了:发送到释放实例的消息
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained *)stackbuf count:(NSUInteger)len {
// First call
if(state->state == 0) {
state->mutationsPtr = &state->extra[0];
state->state = 1;
sqlite3_reset(self.statement);
}
state->itemsPtr = stackbuf;
NSUInteger count = 0;
while (count < len) {
int result = sqlite3_step(self.statement);
if (result == SQLITE_DONE) {
break;
}
MyRow *row = [self queryRow];
stackbuf[count] = row;
count += 1;
}
return count;
}
-(MyRow *) queryRow {
MyRow * row = // query sqlite for row
return row;
}
似乎“行”对象没有被保留,所以当需要在循环中访问它时,它已经被释放了。
在“strong”数据集中的“countByEnumeratingWithState”中迭代时,是否需要保存结果以便保留?
即:
@property (nonatomic, strong) NSMutableArray *resultList;
然后在 while 循环中:
while (count < len) {
int result = sqlite3_step(self.statement);
if (result == SQLITE_DONE) {
break;
}
MyRow *row = [self queryRow];
[self.resultList addObject:row]; // throw into a strong array so its retained
stackbuf[count] = row;
count += 1;
}
编辑:
更多的研究表明,也许我可以使用 __autoreleasing:
MyRow * __autoreleasing row = [self queryRow];
无需维护强大的对象数组。这是正确的解决方案吗?
最佳答案
快速枚举协议(protocol)依赖于它正在枚举的集合保留其包含的项目。调用者(编译器)确保在枚举期间保留集合本身。
countByEnumeratingWithState:
使用的数组包含 __unsafe_unretained
引用。这是安全的,因为编译器会保留集合,集合会保留项目,因此数组中的引用将保持有效。
在语言级别,快速枚举返回的对象引用不为调用者所有,如果需要则必须保留,这当然由 ARC 自动处理。这与处理从任何其他集合(数组、字典等)返回的项目的方式没有什么不同。
现在您的“集合”不同了,它不包含项目,而是根据需要从 SQL 查询中获取项目。这些项目不属于您的“集合”,因此当不再对它们有任何强引用时,ARC 将对其进行释放。因此,您存储在快速枚举 C 数组中的 __unsafe_unretained
引用确实是不安全的 - ARC 会释放它们引用的内容。
解决方案是向您的“集合”添加(即实例变量)一个标准集合,例如 NSMutableArray
。在每次调用 countByEnumeratingWithState:
时,首先清空该集合,从而丢弃您持有的对先前查询结果的任何引用(如果调用代码未保留它们,它们也会被释放),然后用将为此调用返回的查询结果。
当您的“集合”本身最终被 ARC 释放时,它仍然保留的任何对查询结果的引用也将被丢弃。
值得一读Apple's Enumeration Sample因为它的注释包含实现快速枚举所需的内存管理的详细信息。
HTH
关于ios - 发送到释放实例的 NSFastEnumeration 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891397/
我有一个集合维护对其对象的弱引用。我希望它符合 NSFastEnumeration,但 countByEnumeratingWithState:objects:count: 提供的缓冲区使用 unsa
对于 Objective-C 来说,我绝对是一个初学者!任何帮助将不胜感激。 这段代码对我有用,但我真的觉得它将来肯定会对我产生影响。例如,如果有人在 for 循环中间调用 autorelease r
我正在尝试为 sqlite 查询实现 NSFastEnumeration 协议(protocol)。 我遇到了:发送到释放实例的消息 - (NSUInteger)countByEnumeratingW
Swift 3,你会这样做吗? let changeRequest = PHAssetCollectionChangeRequest(...) let fastEnumeration = NSArra
我有一个继承自 NSObject 的类。它使用 NSMutableArray 来保存子对象,例如人们使用 NSMutableArray *items 来保存 Person 对象。如何在项目上实现 NS
我正在尝试将 Objective-C 项目转换为 swift,但我无法找到如何将 NSFastEnumeration 用于符合 NSFastEnumeration 的类的对象。 这是 ObjC 中的代
在什么情况下我们必须在 iphone 中使用 NSFastEnumeration 谁能告诉我如何在 iphone 中使用这些快速枚举的示例代码 最佳答案 NSFastEnumeration 是您的类可
我正在尝试枚举一堆对象,根据情况,这些对象可能是 NSArray 或 NSOrderedSet。由于两者都符合 NSFastEnumeration,我希望它能工作: id enumerableSet
我正在尝试迭代 CMSensorRecorder.accelerometerData(from:to:) 返回的 CMSensorDataList 类的对象。此类确认 NSFastEnumeratio
有谁知道NSFastEnumeration确实比使用 NSEnumerator 更快(在运行时性能方面)或者(对于数组)使用整数计数器并循环遍历元素? 如果它确实更快,它是如何达到那个速度的? 或者“
我有一个id目的。我想计算对象内部的元素数。如何才能实现这一目标? NSFastEnumeration 实现的唯一方法是: - (NSUInteger)countByEnumeratingWithSt
我正在经历这个 appcoda blog并遇到了一个函数,我必须在其中获取可见行的索引。我正在学习和实现 Swift 3/Xcode 8。我得到以下函数的 No subscript members 错
我有一个要枚举的数据结构。我尝试按如下方式实现对象的 NSFastEnumerator: - (NSUInteger)countByEnumeratingWithState:(NSFastEnumer
我有一个类,我希望我的类确认 NSFastEnumeration 协议(protocol)。我已经阅读了文档,但并不是很清楚。谁能告诉我协议(protocol)方法应该返回什么以及它是如何工作的? 最
在将 Objective-C 代码迁移到 ARC 时,我在实现 NSFastEnumeration 协议(protocol)时遇到了问题。有人能告诉我,如何摆脱以下警告(参见代码片段)吗?提前致谢。
我无法在 Xcode 9.3 上构建我的项目。构建失败。但我正在使用下面的 pod 文件。该问题仅发生在 Pod 文件中。 pod 'PromiseKit/Foundation', '~> 1.5.0
我的应用程序尝试从照片中导入图像并添加到相册。 但在最近的快速变化中。 addAssets() 接受参数作为 NSFastEnumeration。所以我得到一个错误,如图所示。 即使是 Apple A
我正在初始化对象的 C 数组并设置第一个元素: id __strong *_objs = (id __strong *)calloc(16,sizeof(*_objs)); _objs[0] = @
我正在尝试为 ZBar 库编写 MonoTouch 绑定(bind),但卡在 ZBarSymbolSet 类型上。乍一看很简单: @interface ZBarSymbolSet : NSOb
我是一名优秀的程序员,十分优秀!