我试图建立一个像这样的自产阶级:
Test *test = [[Test alloc] init];
[test setFrame:frame];
[test setBackgroundColor:[UIColor redColor]];
[self addSubview:test];
这是一个
UIView
子类,此代码位于initWithFrame:
方法内部。类Test
是它自己的名称,自产。现在,我遇到了问题,我在上面可以看到的第一行上添加了一个断点,并且看到它从未经过第一行,只是创建了一个新实例,但从未将其添加到视图中。这是不可能的还是我应该“学习”更多如何正确地做呢?
形象的样子:
如您所见,它永远不会超过第一行。
最佳答案
我明白了代码的问题在于,您忘记了initWithFrame:
是UIView
的指定初始化方法。因此,即使您调用[[Test alloc] init]
,该init
调用也会调用initWithFrame:
本身,从而创建无限循环。
编辑
在iOS中,有一个“指定”初始化程序的概念。只要有几种“ init”方法,就必须使其中一种成为“指定” init。例如,UIView
的指定初始值设定项是initWithFrame
。这意味着所有其他init方法都将在后台调用它,甚至是init。
这是UIView
的init
方法的样子:
-(id)init {
return [self initWithFrame:CGRectMake(0,0,0,0)];
}
这意味着即使将您的类实例化为[[Test alloc] init],
initWithFrame
仍将被UIView
调用。现在,您覆盖了
initWithFrame:
类中的Test
,并且还在该方法内创建了另一个Test
实例,该实例再次调用initWithFrame:
// the init call you have inside this method is calling initWithFrame again beacause
// you're referring to the same Test class...
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// This line here is creating the infinite loop. Right now you're inside
// Test's initWithFrame method. Here you're creating a new Test instance and
// you're calling init... but remember that init calls initWithFrame, because
// that's the designated initializer. Whenever the program hits this line it will
// call again initWithFrame which will call init which will call initWithFrame
// which will call init... ad infinitum, get it?
Test *test = [[Test alloc] init];
[test setFrame:frame];
[test setBackgroundColor:[UIColor redColor]];
[self addSubview:test];
}
}
EDIT2:一种可能的解决方法
为防止这种情况,您可以做的一件事是声明一个
static bool
变量(标志)以指出
Test
是否应继续创建其自身的更多实例:static BOOL _keepCreating = YES;
@implementation Test
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Remember to set _keepCreating to "NO" at some point to break
// the loop
if (_keepCreating)
{
Test *test = [[Test alloc] init];
[test setFrame:frame];
[test setBackgroundColor:[UIColor redColor]];
[self addSubview:test];
}
}
}
@end
希望这可以帮助!
关于ios - 自产类(Class)没有按我的想法工作,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19529021/