1

我对ARC有一点误解。我正在使用以下代码创建一个新的 UIViewController:

    CGRect screenRect = [[UIScreen mainScreen] bounds];

    LocationProfileView *locationProfile = [[LocationProfileView alloc] initWithLocation:l];

    locationProfile.view.frame = CGRectMake(0, screenRect.size.height, screenRect.size.width, 400);
    [appDelegate.window addSubview:locationProfile.view];

    [UIView animateWithDuration:.25 animations:^{
      locationProfile.view.frame = CGRectMake(0, 0, screenRect.size.width, screenRect.size.height);
    }];

在其 UIVIew 中,我放置了一个从屏幕上删除视图的按钮。问题在于locationProfile它在添加到屏幕后立即被释放,所以每次我试图点击“关闭”按钮(它调用LocationProfileView类中的方法)时,我的应用程序都会崩溃。

所以我添加了一个属性:

@property(nonatomic, strong) LocationProfileView *locationProfile;

并将第二行代码更改为:

locationProfile = [[LocationProfileView alloc] initWithLocation:l];

但是现在我的类在我再次启动它之前不会被释放(因为它失去了对第一个实例的引用LocationProfileView?)。每次点击“关闭”按钮时,我应该怎么做才能让我的班级被解除分配?我想设置locationProfiletonil会起作用,但这意味着我必须在主类(包含代码块的那个)中调用一个方法。

这样做的正确方法是什么?对不起,如果我的问题太无聊了。

注意: l是一个自定义类的实例,其中包含一些要在LocationProfileView's中显示的信息UIVIew

4

2 回答 2

2
- (void)closeButtonCallBack {
    [self.locationProfile removeFromSuperview];
    self.locationProfile = nil;
}

我假设您的关闭按钮的目标是视图控制器本身

一个强指针将保留对象,直到 viewController 本身被释放,除非你分配给它 nil

局部变量超出范围时将被释放

或者

不使用强指针,你可以这样做

LocationProfileView *locationProfile = [[LocationProfileView alloc] initWithLocation:l];

UIButton *close = [UIButton buttonWithType:UIButtonTypeRoundedRect];
close.frame = CGRectMake(0, 100, 100, 30);
[close addTarget:locationProfile action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:close];
于 2013-03-01T16:53:02.520 回答
1

在你原来的例子中,

LocationProfile *locationProfile=...

是一个局部变量。因此,一旦您从构造函数返回,它就会被释放。这就是你观察到的。

当您将其设为强属性时,视图控制器会保留 locationProfile:

 @property(nonatomic, strong) LocationProfileView *locationProfile;
于 2013-03-01T16:00:41.327 回答