gpt4 book ai didi

objective-c - 为什么我的NSArray被释放?

转载 作者:行者123 更新时间:2023-12-01 17:09:58 24 4
gpt4 key购买 nike

我试图理解自动引用计数,因为我来自高级编程语言(Python),并且我正在一个使用Objective-C此功能的项目中进行工作。 ARC经常会在以后分配需要的对象时遇到问题,但是现在我有了一个具体的示例,希望对此做出解释。

- (void) animateGun:(UIImageView *)gun withFilmStrip:(UIImage *)filmstrip{
NSMutableArray *frames = [[NSMutableArray alloc] init];
NSInteger framesno = filmstrip.size.width / gun_width;
for (int x=0; x<framesno; x++){
CGImageRef cFrame = CGImageCreateWithImageInRect(filmstrip.CGImage, CGRectMake(x * gun_width, 0, gun_width, gun_height));
[frames addObject:[UIImage imageWithCGImage:cFrame]];
CGImageRelease(cFrame);
}
gun.image = [frames objectAtIndex:0];
gun.animationImages = frames;
gun.animationDuration = .8;
gun.animationRepeatCount = 1;
[gun startAnimating];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(arc4random() % 300)/100 * NSEC_PER_SEC), dispatch_get_current_queue(),^{
[self animateGun:leftGun withFilmStrip:[self getFilmStripForAction:gunShoot andTeam:nil withWeapon:nil]];
});
}

这段代码背后的想法很简单:我有一个 (UIImageView*)gun,它会随机存储在 (NSMutableArray *)frames中的图像动画。 (UIImage *)filmstrip只是一张图像,其中包含将在动画上使用的所有帧。动画的第一个迭代有效,但是问题出现在第二个迭代中,在那里我得到 -[UIImage _isResizable]: message sent to deallocated instance ...-[UIImage _contentStretchInPixels]: message sent to deallocated instance ...-[NSArrayI release]: message sent to deallocated instance ...。这发生在
gun.animationImages = frames;

但我不明白为什么。我不是要解决我的问题,而只是为了帮助我了解此处的情况。谢谢。

最佳答案

ARC是一种无需手动保留/释放对象的机制。这是一个很好的网站,解释了它是如何工作的:http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

尝试将“leftGun”更改为“gun”。我认为,如果通过ivar使用它,那可能是在某个时候释放的对象。否则,leftGun根本不在范围内。

它应该是这样的:

在您的.h文件中:

@property (nonatomic, strong) IBOutlet UIImageView *leftGun;

在您的.m文件中:
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(arc4random() % 300)/100 * NSEC_PER_SEC), dispatch_get_current_queue(),^{
[self animateGun:gun withFilmStrip:[self getFilmStripForAction:gunShoot andTeam:nil withWeapon:nil]];
});

另外,不太确定“gunShoot”来自何处。那应该是枚举吗?

编辑

添加了有关如何定义 leftGun属性的示例。在ivar上使用属性的原因是出于内存管理的目的。如果要释放或销毁作为属性的对象,只需将其设置为nil即可,如果需要,该属性将负责释放该对象。

关于objective-c - 为什么我的NSArray被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12781366/

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