我试图建立一个像这样的自产阶级:

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。

这是UIViewinit方法的样子:

-(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/

10-12 05:41