IOS7 Singleton对象访问错误代码1

时间:2013-09-19 23:23:58

标签: objective-c object singleton exc-bad-access ios7

IOS 7更新后,

(CODE UPDATED),我的应用程序崩溃了单身标签(这只发生在设备上)...第一次访问单身一切都没关系,但第二次ClassSingleton是零。有人可以帮忙吗? (在IOS 7之前一切都很好......现在我得到了错误的访问代码= 1)

我正在使用ARC ......

感谢

ClassSingleton.h

@property (nonatomic, strong) IBOutlet UILabel *lblResultado;

ClassSingleton.m

@synthesize lblResultado;


__strong static ClassSingleton *pOutClassSingletonReturn = nil;



#pragma mark Singleton Methods


+ (void)initialize
{
        pOutClassSingletonReturn = [[super allocWithZone:NULL] init];

        pOutClassSingletonReturn.lblResultado = [[UILabel alloc] init];
        pOutClassSingletonReturn.lblResultado.backgroundColor = [UIColor clearColor];
        pOutClassSingletonReturn.lblResultado.textColor = [UIColor whiteColor];
        pOutClassSingletonReturn.lblResultado.textAlignment = NSTextAlignmentRight;

        pOutClassSingletonReturn.lblResultado.text = @"0";
}



+ (ClassSingleton*) pOutClassSingletonReturn
{
    return pOutClassSingletonReturn;
}

@end

AccessClass.m

@implementation AccessClass

__strong static ClassSingleton *pOutClassSingletonReturn;



- (void)viewDidLoad
{
    [super viewDidLoad];

    externalsObjects = [NSDictionary dictionaryWithObject:[ClassSingleton  pOutClassSingletonReturn] forKey:@"pOutClassSingletonReturn"];


    nibOptions = [NSDictionary dictionaryWithObject:externalsObjects forKey:UINibExternalObjects];

    [self.nibBundle loadNibNamed:self.nibName owner:self options:nibOptions];

    pOutClassSingletonReturn = [ClassSingleton pOutClassSingletonReturn];

    pOutClassSingletonReturn.lblResultado.text = @"1";
}


- (IBAction) button: (id) sender

{
     pOutClassSingletonReturn.lblResultado.text = @"blabla";  //==>>> Crash second time i press the button
}

5 个答案:

答案 0 :(得分:3)

您在现代Objective-C中不正确地实现了单例模式。

在这个例子中,让我们调用你的Singleton类方法sharedInstance。按如下方式初始化您的单身:

+ (id)sharedInstance
{
    static id sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

然后,在同一个Singleton类中,将初始化代码放在init方法

- (id)init
{
    self = [super init];
    if (self) {

        // Your initialization code goes here

    }
    return self;
}

您可以将方法从init更改为您想要的任何内容。只需确保在sharedInstance类方法中更改名称。

要在其他课程中调用您的Singleton,只需执行以下操作:

[MySingletonClass sharedInstance]

第一次调用时,将设置Singleton中的init方法(这很明显,因为它是一个Singleton)。

答案 1 :(得分:0)

尝试使用静态+ (void)initialize方法初始化单例。

请参阅:What should my Objective-C singleton look like?

答案 2 :(得分:0)

我没有看到你在AccessClass.m中声明pOutClassSingletonReturn的位置,因此很难判断它是全局变量,实例变量,是对ClassSingleton中pOutClassSingletonReturn的引用。嗯,或者什么。但我怀疑问题不在于ClassSingleton.m中的pOutClassSingletonReturn和AccessClass.m中的问题。确保这是一个强大的参考,或者至少将其添加到-viewDidLoad中的视图层次结构中。

答案 3 :(得分:0)

首先,我要感谢所有试图提供帮助的人!

我发现了错误(单身就行了......)......错误是

当我连接2个NSString时,我得到一个错误(进一步在单例中):

pOutclassCalculadora.pstrOutParcela1 = [pOutclassCalculadora.pstrOutParcela1 stringByAppendingString: pOutclassCalculadora.pstrOutTeclaSender];

现在我正在这样做,一切都很好(没有糟糕的访问权限):

pOutclassCalculadora.pstrOutParcela1 = [NSString stringWithFormat:@"%@%@",pOutclassCalculadora.pstrOutParcela1,pOutclassCalculadora.pstrOutTeclaSender];

最大的问题......为什么这个“stringByAppendingString”在模拟器和IO6中工作并在IOS7中崩溃(并且仅在设备中)?????

答案 4 :(得分:-1)

如果您正在使用ARC,请尝试将静态声明为强大,如下所示:

__strong static ClassSingleton *pOutClassSingletonReturn = nil;

让ARC知道为你保留它。