gpt4 book ai didi

ios - UISnapBehavior 的这种内存泄漏是误报吗?

转载 作者:行者123 更新时间:2023-11-29 00:59:13 34 4
gpt4 key购买 nike

我正在尝试使用 UISnapBehaviour 为 UIButton 设置动画。我关注了Apple ReferencesApple Dynamics Catalog ,但不是使用点击手势来启动动画,而是在 View 启动时自动出现一个动画启动按钮。我的代码在模拟器中运行,即动画有效,动画结束时按钮也有效。但是即使动画看起来工作正常,Xcode 中的分析器也会报告内存泄漏。

我尝试重新定位 [self.animator addBehavior:_snapButton];[self.animator removeBehavior:_snapButton]; 在几个动画仍然有效的地方,感觉就像我做的一切都正确。但无论我做什么,我都无法将保留计数设为 0。我开始怀疑分析器中可能存在错误。

这是我的代码。我声明了属性

@interface WaitView ()
@property (nonatomic, strong) UIDynamicAnimator *animator;
@property (nonatomic, strong) UISnapBehavior *snapBehavior;
@end

然后在[super viewDidLoad]

之后初始化 UIDynamicAnimator
- (void)viewDidLoad {
[super viewDidLoad]; // then tried [self startButton];
[self startButton]; // followed by [super viewDidLoad];

UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
self.animator = animator;
[animator release];
} // Wait view

并在动画之前创建了一个 UIButton

- (void)startButton {
CGPoint snapPoint = CGPointMake(160,284);
UIButton *wait = [UIButton buttonWithType:UIButtonTypeCustom];
wait.frame = CGRectMake(0, 0, 80, 80);
[wait setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"familyDot%d", 1]] forState:UIControlStateNormal];
wait.tag = 1;
[wait setTitle:[NSString stringWithFormat:@"%i", 1] forState:UIControlStateNormal];
[wait setTitleColor:[UIColor blackColor] forState: UIControlStateNormal];
wait.titleLabel.hidden = NO;
[wait addTarget:self action:@selector(tapTest) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:wait];

[self.animator removeAllBehaviors];
UISnapBehavior* _snapButton = [[UISnapBehavior alloc] initWithItem:wait snapToPoint:snapPoint];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
[self.animator addBehavior:_snapButton];
[_snapButton release];
}


编辑根据 Kurt 的回复,解决方案是将我上面动画代码的最后五行替换为以下

    UISnapBehavior* _snapButton = [[[UISnapBehavior alloc] initWithItem:wait snapToPoint:target] autorelease];
self.animator = [[[UIDynamicAnimator alloc] initWithReferenceView:self.view] autorelease];
[self.animator addBehavior:_snapButton];


并包括对按钮的测试。

- (void)tapTest {
NSLog(@“Start button works!");
}

这是分析器报告的内存泄漏的细目:

    self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 

1。方法返回一个保留计数为 +1 的 Objective-C 对象

    [self.animator addBehavior:_snapButton];

2。对象泄漏:已分配的对象稍后未在此执行路径中引用,保留计数为 +1

谁能告诉我这是否真的是内存泄漏?或者如果我做错了什么?

最佳答案

是的,这会导致泄漏。问题都在一条线上:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

[[UIDynamicAnimator alloc] initWithReferenceView:self.view] 返回一个引用计数为 +1 的对象。您有责任在完成后发布它。

然后你执行 self.animator = 那个对象。由于它是一个 strong 属性,它会释放旧对象(如果有)并保留新对象。所以你的对象现在有 +2 的保留计数。

然后您从该方法返回。假设您遵循通常的内存管理规则并稍后释放您的 strong 属性,您将只会释放该对象一次。它仍然会有 +1 保留计数,你会泄露它。

要修复它,请完全按照您在 -viewDidLoad 中所做的操作:

 UIDynamicAnimator *newAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
self.animator = newAnimator;
[newAnimator release];

或者:

 self.animator = [[[UIDynamicAnimator alloc] initWithReferenceView:self.view] autorelease];

或转换为 ARC!它会为您完成这一切。

关于ios - UISnapBehavior 的这种内存泄漏是误报吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223574/

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