1

(代码更新)在 IOS 7 更新后,我的应用程序因单例标签而崩溃(这仅在设备中发生)...第一次访问单例一切正常,但第二次 ClassSingleton 为零。任何人都可以帮忙吗?(在 IOS 7 之前一切都很好......现在我得到 Bad Access Code =1)

我正在使用ARC ...

谢谢

类单例.h

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

类单例.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

访问类.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
}
4

5 回答 5

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]

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

于 2013-09-20T22:01:23.737 回答
0

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

我发现了错误(单例没问题...)...错误是

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

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

现在我正在这样做,一切都很好(没有错误的访问):

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

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

于 2013-09-21T11:08:22.947 回答
0

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

请参阅:我的 Objective-C 单例应该是什么样的?

于 2013-09-19T23:38:22.920 回答
0

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

于 2013-09-20T21:13:21.657 回答
-1

如果您使用的是 ARC,请尝试像这样声明静态为强:

__strong static ClassSingleton *pOutClassSingletonReturn = nil;

以便 ARC 知道为您保留它。

于 2013-09-20T19:39:22.330 回答