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,因为控件不一定添加到调用视图层次结构中。控件的目的是分离功能,以避免大量视图控制器。该属性不负责视图控制器中的任何其他内容,因此没有理由保留该属性。