gpt4 book ai didi

iOS:如何在操作大型 NSString 实例时避免自动释放副本?

转载 作者:可可西里 更新时间:2023-11-01 03:33:19 25 4
gpt4 key购买 nike

我在一个 iOS 应用程序中有一个场景,其中操作一个非常大的 NSString 实例(一个 HTTP 响应,超过 11MB)导致多个大型中介同时在内存中,因为我调用的 SDK 方法返回新的自动释放实例。此处采用什么最佳方法?

例如,假设 largeString 是一个自动释放的 NSString 实例:

NSArray *partsOfLargeString = [largeString componentsSeparatedByString:separator];

for (NSString *part in partsOfLargeString) {
NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSData *data = [trimmedPart dataUsingEncoding:NSUTF8StringEncoding];
}

如果有 componentsSeparatedByStringstringByTrimmingCharactersInSet 的非自动发布等效项,那就太好了,但我不打算自己实现这些。

据我所知,没有办法“强制”释放已经添加到自动释放池中的对象。我知道我可以在这里创建和使用我自己的自动释放池,但我希望非常精细,并且围绕单个语句设置自动释放池绝对不是一种可扩展性很强的方法。

非常感谢任何建议。

最佳答案

正如 Bill 所说,我会首先尝试为每个循环迭代设置一个自动释放池,例如:

for (NSString *part in partsOfLargeString) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];

NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSData *data = [trimmedPart dataUsingEncoding:NSUTF8StringEncoding];


[pool drain];
}

或者,如果您使用的是足够新的编译器:

for (NSString *part in partsOfLargeString) {
@autoreleasepool {
NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSData *data = [trimmedPart dataUsingEncoding:NSUTF8StringEncoding];

}
}

如果这仍然 Not Acceptable 并且您确实需要以更细粒度的方式释放对象,您可以使用类似的方法:

static inline __attribute__((ns_returns_retained))
id BICreateDrainedPoolObject(id (^expression)(void)) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
id object = expression();
[object retain];
[pool drain];
return object;
}

#define BIOBJ(expression) BICreateDrainedPoolObject(^{return (expression);})

计算表达式,保留其结果,释放任何辅助的自动释放对象并返回结果;然后:

for (NSString *part in partsOfLargeString) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];

NSString *trimmedPart = BIOBJ([part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]);
NSData *data = BIOBJ([trimmedPart dataUsingEncoding:NSUTF8StringEncoding]);
[trimmedPart release];

// do something with data
[data release];



[pool drain];
}

请注意,由于该函数返回一个保留对象,因此您有责任释放它。您可以控制何时执行此操作。

请随意为函数和宏选择更好的名称。可能有一些极端情况需要处理,但它应该适用于您的特定示例。欢迎提出建议!

关于iOS:如何在操作大型 NSString 实例时避免自动释放副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404307/

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