gpt4 book ai didi

iphone - 在 block 中使用 ivar 返回到其他对象

转载 作者:行者123 更新时间:2023-12-03 20:29:21 24 4
gpt4 key购买 nike

我发现目标 iOS 4 的 iPhone 应用程序崩溃,该崩溃根据构建类型而变化。

调试器没有给我太多的信息,它停在

 UIViewController *result = [self factory](self);

具有 EXC_BAD_ACCESS。 self 是一个继承自 NSObject 的类(如下所示为 NSObjectInheritor)。僵尸已启用。我尝试以三种方式更改方法factory,结果如下。

这会在调试和临时构建中崩溃......

- (FactoryMethod) factory;
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[ViewControllerClass alloc] initWithStuff:(boolValue ? foo : bar)];
} autorelease];
}

这在调试版本中有效,但在临时版本中崩溃...

- (FactoryMethod) factory;
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
if(boolValue)
{
return [[ViewControllerClass alloc] initWithStuff:foo];
}
else
{
return [[ViewControllerClass alloc] initWithStuff:bar];
}
} autorelease];
}

这在调试和临时环境中都有效,但非常丑陋且多余:

- (FactoryMethod) factory;
{
if(boolValue)
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[ViewControllerClass alloc] initWithStuff:foo];
} autorelease];
}
else
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[[ViewControllerClass alloc] initWithStuff:bar];
} autorelease];
}
}

我的理论是,在执行返回的 block 时,boolValue 变得不可访问。这是

@interface SubclassOfNSObjectInheritor : NSObjectInheritor
{
BOOL boolValue;
}

@property (readonly) BOOL boolValue;

(当然在 SubclassOfNSObjectInheritor 的 init 中分配了 YESNO)和

@synthesize boolValue;

在 SubclassOfNSObjectInheritor 的实现中。

最后的问题是 - 我关于错误的理论正确吗?第三种方法(称为在临时和调试版本中工作)安全吗?最好的方法是什么?

最佳答案

你的问题是双重的,首先你过度释放了你的 block ,其次, block 是在堆栈上创建的,当你的方法返回时它就会消失(你基本上是返回一个指向先前销毁的堆栈帧的指针)。

相反,复制 block 并在返回之前自动释放它。您可以使用 copy 消息以 Objective-C 方式执行此操作,您可以调用 Block_copy() 函数。

您在各种配置下的崩溃纯属偶然。因此,要修复您的实现之一:

- (FactoryMethod) factory;
{
return [[^(NSObjectInheritor *newThing)
{
if(boolValue)
{
return [[ViewControllerClass alloc] initWithStuff:foo];
}
else
{
return [[ViewControllerClass alloc] initWithStuff:bar];
}
} copy] autorelease];
}

关于iphone - 在 block 中使用 ivar 返回到其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154598/

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