gpt4 book ai didi

ios - 自产类没有像我想象的那样工作,为什么?

转载 作者:行者123 更新时间:2023-11-28 18:35:46 25 4
gpt4 key购买 nike

我正在尝试创建一个这样的自生成类:

Test *test = [[Test alloc] init];
[test setFrame:frame];
[test setBackgroundColor:[UIColor redColor]];
[self addSubview:test];

这是一个 UIView 子类,这段代码在 initWithFrame: 方法中。类 Test 是它自己的名字,自产。

现在我遇到的问题是,我在上面的第一行添加了一个断点,我发现它从未经过第一行,只是创建了一个新实例,但从未将其添加到 View 中。这是不可能的还是我应该“研究”更多如何正确地做到这一点?

图像看起来如何:Image of xCode

如您所见,它永远不会超过第一行。

最佳答案

我现在明白了。您的代码的问题是您忘记了 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 调用。

现在,您在 Test 类中覆盖了 initWithFrame: 并且还在该方法中创建了另一个 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 - 自产类没有像我想象的那样工作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com