2010-11-08 36 views
0

坚持我。我有视觉障碍,以前从未使用过此网站,并且可能不会按照您习惯的格式进行发布。我对此处的任何无意失礼表示歉意。为什么我的单身人士课程不能返回一个值将保持在范围内

在iOS的项目中使用的Objective-C ...

我有一个单独的类中,这似乎是对Objective-C的通常的方式成立。它主要是一系列接受NSString值的方法,解释它们并返回其他内容。在下面的代码中,我将事物简化到最低限度,以强调我遇到的问题。

从单例类:

- (NSUInteger) assignControlState:(NSString *)state { 
    // excerpted for clarity... 
    return UIControlStateNormal; // an example of what might be returned 
} 

现在,另一个类的一个实例,试图用这种方法,像这样:

- (void) buttonSetup:(UIButton*)button { 
    [button setTitle:@"something" forState:[[SingletonClass accessToInstance] assignControlState:@"normal"]]; 
} 

此代码实际工作。 HOwever,当系统绘制包含按此方式设置标题的按钮的UI时,会发生EXC_BAD_ACCESS错误。

如果assignControlState方法被移入与buttonSetup方法相同的类中,则不会生成错误。

我猜这是关于苹果公司内存管理的一些事情,我没有完全理解,以及事情如何进出范围,但对于我的生活,我无法弄清楚我在哪里出错了。

HO有人可以帮忙。谢谢。

+0

很难说这些代码行。从附加的调试器开始(不仅仅是调试模式),您将获得非常有用的信息。 – Eiko 2010-11-08 23:53:02

+0

这与范围无关。这只是不正确的内存管理,通常与Objective-C中的范围无关。 – Chuck 2010-11-08 23:59:54

回答

2

问题出在您的accessToInstance方法中。我敢打赌,你保持不足。实施应该更像:现在

static SingletonClass *sSingletonClass = nil; 

@implementation 

+ (id)accessToInstance { 
    if (sSingletonClass == nil) { 
    sSingletonClass = [[[self class] alloc] init]; 
    } 
    return sSingletonClass; 
} 
@end 

,如果你的程序是按正常的内存管理规则,单身会呆在身边。您可以通过书面检查:

- (void)dealloc { 
    [super dealloc]; // <-- set a breakpoint here. 
} 

如果调试器曾经在这个断点处停止,你知道你的程序事情已经过发布了单。

+0

谢谢。 HOwever,就我所知,你对单身人士的执行与我的要领完全相同。然而,我确实是否在单身人士身上调用了dealloc。事实并非如此。 – Josh 2010-11-09 03:12:40

+0

奇怪的是:如果我简单地使用NSLog()来输出单例方法返回的值,它将打印出来,执行其业务,并最终再次锁定EXC_BAD_ACCESS错误。注意NSLog()可以避免这个问题。对于绝对任何导致问题的东西,似乎都使用单例,即使没有任何东西试图引用它返回的数据。 *叹* – Josh 2010-11-09 03:14:55

0

你知道这句话是为了清晰起见而摘录的吗?我认为你需要向我们展示它是什么,因为它可能在某处发布过度版本。

具体来说,我认为你释放一个autoreleased对象。如果你这样做并且不再使用这个对象,那么一切都会正常进行,直到autorelease池被耗尽。在绘图通常发生的同时,autorelease池会在事件结束时自动排空。

这也将解释NSLogs后的延迟崩溃。

相关问题