Objective c 保留对象而不使用属性

Objective c 保留对象而不使用属性,objective-c,exc-bad-access,retaincount,ivar,Objective C,Exc Bad Access,Retaincount,Ivar,我有一个控件,它的工作方式如下: MyCustomControl *control = [[MyCustomControl alloc] initWithNavigationController:self.navigationController]; control.completion = ^{ [self controlCompletedAction]; }; [control showFromView:self.view]; @interface YourClass {

我有一个控件,它的工作方式如下:

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

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

[control showFromView:self.view];
@interface YourClass {
    MyCustomControl *control;
}
但是,由于它没有被任何东西保留,所以当试图调用某些方法时,控件会获得错误的访问权限

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

@property(nonatomic, strong) MyCustomControl *control;

两者都很好

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


那么,有没有一种方法可以不使用属性/ivar或求助于objc运行时来保留控件?

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

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

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

[control showFromView:self.view];
@interface YourClass {
    MyCustomControl *control;
}
您应该使用属性,因为属性传达了所有权的概念,这使代码更易于理解和维护

也许您不愿意将该控件作为实例化它的视图控制器的属性,因为它不属于该视图控制器。然后问题就变成了,控制权属于什么?如果它属于导航控制器,请考虑对导航控制器进行子类化,并将控件添加为导航控制器属性。 如果控件是UIView的子类并将添加到视图层次结构中,则不需要将其作为属性保留,因为它将由其superview保留,并在不再位于视图层次结构中时释放

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

您可以在自定义控件类中使用静态变量,但前提是同时只有一个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;

}

什么方法可以获得坏访问?你能在代码崩溃的地方发布代码吗?顺便说一句,retain应该替换为strong retain,因为控件不一定添加到调用视图层次结构中。控件的目的是分离功能,以避免大量视图控制器。该属性不负责视图控制器中的任何其他内容,因此没有理由保留该属性。