gpt4 book ai didi

iphone - 似乎无法使用 NSArray 调用 NSInitationOperation

转载 作者:行者123 更新时间:2023-12-03 21:16:34 25 4
gpt4 key购买 nike

我正在尝试从网址加载后台图像。如果我传递的只是 NSUrl,则代码效果很好。如果我尝试传递带有附加变量的 NSArray,它永远不会被调用:

这段代码效果很好,调用了 LoadImage2,而 LoadImage2 又很好地调用了 ImageLoaded2。

- (void)LoadBackgroundImage2: (char*)pImageURL
{

NSString* pImageURLString = [NSString stringWithFormat:@"%s", pImageURL];

NSLog( @"LoadBackgroundImage2: %@", pImageURLString );

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(LoadImage2:)
object:pImageURLString];
[queue addOperation:operation];
[operation release];
}


- (void)LoadImage2: (NSString*)pImageURL
{
NSLog( @"LoadImage2: %@", pImageURL );

NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:pImageURL]];
UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
[imageData release];
[self performSelectorOnMainThread:@selector(ImageLoaded2:) withObject:image waitUntilDone:NO];
}

该代码不起作用。 LoadImage 永远不会被调用:

- (void)LoadBackgroundImage: (char*)pImageURL :(int)textureID :(int)textureType
{

printf( "LoadBackgroundImage( %s, %d, %d)\n", pImageURL, textureID, textureType );

NSString* pImageURLString = [NSString stringWithFormat:@"%s", pImageURL];

NSArray* pUrlAndReferences = [[[NSArray alloc] initWithObjects: pImageURLString, textureID, textureType, nil] autorelease];

NSOperationQueue *queue = [[NSOperationQueue new] autorelease];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(LoadImage:)
object:pUrlAndReferences];

[queue addOperation:operation];
[operation release];
}


- (void)LoadImage: (NSArray*)pUrlAndReferences
{
NSString* pImageUrl = [pUrlAndReferences objectAtIndex: 0];
int textureId = [ [ pUrlAndReferences objectAtIndex: 1 ] intValue ];
int textureType = [ [ pUrlAndReferences objectAtIndex: 2 ] intValue ];

NSLog( @"\n\nLoadImage: %@, %d, %d\n", pImageUrl, textureId, textureType );

NSData* pImageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:pImageUrl]];
UIImage* pImage = [[[UIImage alloc] initWithData:pImageData] autorelease];

NSArray* pImageAndReferences = [[[NSArray alloc] initWithObjects: pImage, textureId, textureType, nil] autorelease];

[pImageData release];
[self performSelectorOnMainThread:@selector(ImageLoaded:) withObject:pImageAndReferences waitUntilDone:NO];
}

有人知道为什么 LoadImage 没有被调用吗?

谢谢。

最佳答案

我的猜测是你没有保留你的队列。这就是发生的事情

  1. 您的数组(自动释放)进入 NSInvocableOperation 并被保留(没问题)
  2. 您的NSInitationOperation进入队列(保留),然后被释放。这里没有问题,因为保留计数仍然是 1:1 (alloc) + 1 (retain) - 1 (release) = 1 = not已解除分配。
  3. 您的队列已分配 (new = alloc+init),然后自动释放,但不会在其他地方保留。问题来了:由于你已经自动释放了队列,一旦LoadBackgroundImage方法完成,队列的保留计数为0,并且它会自动释放,因此,你的调用将不会被执行。<

如果这就是问题所在,您可以尝试从队列中删除 autorelease 调用。如果我是正确的,你的代码应该可以工作。但请注意,这不是一个好的解决方案,因为您会丢失内存。只是为了看看它是否有效。

你绝对应该创建一个类、一个单例、一个实例变量或任何你喜欢的东西来保留队列的实例。另外,最好只使用一个队列来处理所有 LoadBackgroundImage 调用,而不是每次都创建一个新队列。

关于iphone - 似乎无法使用 NSArray 调用 NSInitationOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504965/

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