我想用ARC迁移这段代码。
我知道我必须使用:
@autoreleasepool {}但是我的两个游泳池的排水口出了点问题,我不知道该怎么办。
- (void)downloadImageToCache:(NSString*)_urlImage
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (!(_urlImage) || (_urlImage == nil))
{
[pool drain];
return;
}
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil)
{
...do something...
}
else
{
...do something...
}
[pool drain];
}发布于 2013-04-16 04:00:45
把整个东西都包起来。不要担心回报问题。它会解决这个问题的。
也就是说,编译器会把它转换成逻辑上等价的:(或者你也可以显式地清理逻辑)
- (void)downloadImageToCache:(NSString*)_urlImage
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (!(_urlImage) || (_urlImage == nil))
{
//[pool drain];
//return;
} else {
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil)
{
...do something...
}
else
{
...do something...
}
}
[pool drain];
}这将简化为:
- (void)downloadImageToCache:(NSString*)_urlImage {
@autoreleasepool {
if (_urlImage != nil) {
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil) {
// ...do something...
} else {
//...do something...
}
}
}
}或者(更少的嵌套缩进始终是我的偏好):
- (void)downloadImageToCache:(NSString*)_urlImage {
if (_urlImage == nil) {
NSLog(@"[%@ %@] Error Message", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
return;
}
@autoreleasepool {
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil) {
// ...do something...
} else {
//...do something...
}
}
}发布于 2013-04-16 03:59:18
您可以从自动释放池中“提前返回”,这将释放池中的所有对象:
- (void)downloadImageToCache:(NSString*)_urlImage
{
@autoreleasepool {
if (!(_urlImage) || (_urlImage == nil))
{
// no need (not allowed) to call `drain`
return;
}
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil)
{
...do something...
}
else
{
...do something...
}
// no need (not allowed) to call `drain`
}
}发布于 2013-04-16 03:59:52
使用新的@autorelease块语法,当执行退出块时,池将被排空。所以你可以这样做:
- (void)downloadImageToCache:(NSString*)_urlImage
{
@autoreleasepool {
if (!(_urlImage) || (_urlImage == nil))
{
return; //leaves @autoreleasepool block, automatically drains
}
NSURL *url = [NSURL URLWithString:_urlImage];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url] autorelease];
if (data != nil)
{
...do something...
}
else
{
...do something...
}
} //leaves @autoreleasepool block, automatically drains
}有关更多信息,请参阅AutoreleasePools
https://stackoverflow.com/questions/16023657
复制相似问题