(CODE UPDATED),我的应用程序崩溃了单身标签(这只发生在设备上)...第一次访问单身一切都没关系,但第二次ClassSingleton是零。有人可以帮忙吗? (在IOS 7之前一切都很好......现在我得到了错误的访问代码= 1)
我正在使用ARC ......
感谢
@property (nonatomic, strong) IBOutlet UILabel *lblResultado;
@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
@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
}
答案 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
方法初始化单例。
答案 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知道为你保留它。