不使用属性保留对象

时间:2015-03-27 16:33:36

标签: objective-c exc-bad-access retaincount ivar

我有一个像这样的控件:

MyCustomControl *control = [[MyCustomControl alloc] initWithNavigationController:self.navigationController];

control.completion = ^{
    [self controlCompletedAction];
};

[control showFromView:self.view];

但是,由于它没有被任何内容保留,因此在尝试调用某些方法时,控件会获得错误的访问权限。

将控件保留在调用类的属性中可以正常工作,例如:

@property(nonatomic, strong) MyCustomControl *control;

@interface MyViewController {
    MyCustomControl *control;
}

两者都很好。

但是我不想为我正在制作的每个不同控件添加属性。 控件的目的是分离功能以避免大规模视图控制器。该属性不对视图控制器中的任何其他内容负责,因此没有理由保留它。

那么,有没有办法使用属性/ ivar或使用objc运行时来保留控件

3 个答案:

答案 0 :(得分:0)

如果您愿意,可以使用实例变量(实质上是全局变量)而不是属性。它看起来像这样:

@interface YourClass {
    MyCustomControl *control;
}

答案 1 :(得分:0)

使用属性,因为属性传达了所有权的概念,这使您的代码更易于理解和维护。

也许您不愿意将控件设置为实例化它的视图控制器的属性,因为它不属于到该视图控制器。那么问题就变成了控制属于什么?如果它属于导航控制器,请考虑将导航控制器子类化并将控件添加为导航控制器属性。

如果控件是UIView的子类并且将被添加到视图层次结构中,则不需要将其保留为属性,因为它将由超级视图保留,并在不再位于视图层次结构中时释放。

如果我的建议对您没有意义,您能否提供有关控件本身的更多信息?

答案 2 :(得分:0)

您可以在自定义控件类中使用static变量,但前提是同时只有一个MyCustomControl实例(如popover,但即使它需要强变量)。 代码示例:

// MyCustomControl.m

static MyCustomControl * _currentInstance = nil;

-(void)showFromView:(UIView *)fromView

{ [_currentInstance dismiss];

// show code here ...

_currentInstance = self;

}

- (void)dismiss

{ // remove your control

_currentInstance = nil;

}