Синглтон Целочисленный выпуск - PullRequest
0 голосов
/ 16 октября 2010

У меня есть синглтон, в котором я держу одно целое число, мой счет. Однако, когда я загружаю его из синглтона в другом виде, он не показывает то, что я хочу, а вместо этого придерживается проводной 6592960. Есть идеи почему? Как-то связано с тем, как я использую @property. Я думаю, какой правильный путь к @property int?

Спасибо.

EDIT: Код: Синглтон .ч

#import <Foundation/Foundation.h>


@interface scoreData : NSObject {

    int score;
}

@property int score;

+ (scoreData *)sharedData;

@end

Синглтон .м

#import "scoreData.h"


static scoreData *sharedData = nil;

@implementation scoreData

@synthesize score;

#pragma mark -
#pragma mark Singleton Methods
+ (scoreData *)sharedData {
    if(sharedData == nil){
        sharedData = [[super allocWithZone:NULL] init];
    }
    return sharedData;
}
+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedManager] retain];
}
- (id)copyWithZone:(NSZone *)zone {
    return self;
}
- (id)retain {
    return self;
}
- (unsigned)retainCount {
    return NSUIntegerMax;
}
- (void)release {
    //do nothing
}
- (id)autorelease {
    return self;
}

@end

В моем другом представлении я получаю доступ вот так, а затем пытаюсь изменить номер и, конечно, импортирую синглтон:

scoreData *score = [scoreData sharedData];
score.score = 0;

Ответы [ 3 ]

0 голосов
/ 16 октября 2010

Я бы написал @property так:

@property (nonatomic,assign) int score;

Также я бы изменил sharedData:

+ (scoreData *)sharedData {
    if( sharedData == nil ){
        sharedData = [[self alloc] init];
    }
    return sharedData;
}

Редактировать: я попробовал ваш код и получил EXC_BADACCESS, потому что он стал рекурсивным здесь:

+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedManager] retain];
}

Когда я удалил этот метод, все заработало как положено.

0 голосов
/ 17 октября 2010

MySingleton.h

#import <Foundation/Foundation.h>

@interface MySingleton : NSObject {

}
@property(nonatomic,assign) int score;
+ (MySingleton*) sharedInstance;

@end

MySingleton.m

#import "MySingleton.h"

static MySingleton *_instance;
@implementation MySingleton
@synthesize score;

+ (MySingleton*)sharedInstance
{
    @synchronized(self) {
        if (_instance == nil) {
            _instance = [[super allocWithZone:NULL] init];
        }
    }
    return _instance;
}

#pragma mark Singleton Methods
+ (id)allocWithZone:(NSZone *)zone
{   
    return [[self sharedInstance]retain];   
}

- (id)copyWithZone:(NSZone *)zone
{
    return self;    
}

- (id)retain
{   
    return self;    
}

- (unsigned)retainCount
{
    return NSUIntegerMax; 
}

- (void)release
{
}

- (id)autorelease
{
    return self;    
}

@end

См. Этот xcode-template для упрощения создания синглтона.

0 голосов
/ 16 октября 2010

Если это настоящий синглтон, тогда вы можете получить доступ к инициализатору и установщику напрямую к инициализированной статической глобальной переменной и пропустить все выделение времени выполнения и зону занятой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...