0

シングルトンの概念を使用して GPS 情報を保持しようとしていますが、変数の表示がゼロになるだけの問題がどこにあるのかわかりません。

Singleton.h:

@interface Singleton : NSObject

@property (readwrite) NSString *propertyA;
@property (readwrite) NSString *propertyB;
@property (readwrite) NSString *propertyC;

+ (Singleton *)sharedInstance;

@end

Singleton.m:

#import "Singleton.h"

@interface Singleton ()
{
    NSString *variableA;
    NSString *variableB;
    NSString *variableC;
}
@end

@implementation Singleton

static Singleton *sharedInstance = nil;

+ (Singleton *)sharedInstance
{
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[Singleton alloc] init];
        }
    }
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];
            return sharedInstance;
        }
    }
    return nil;
}

- (id)init
{
    self = [super init];
    if (self)
    {
        variableA = nil;
        variableB = nil;
        variableC = nil;
    }
    return self;
}

@end

OverlayViewController.m で:

#import "Singleton.h"

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            _longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            _latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }

        // Setting properties
        NSString *variableA = _latitudeLabel.text;
        [[Singleton sharedInstance] setPropertyA:variableA];      
}

次に、もう少し下の値を思い出します...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
     NSString *variableA = [[Singleton sharedInstance] propertyA];    
     NSLog(@"Latitude = %.8f", variableA);
}

ありがとうレジス

4

2 に答える 2

0

私の最初の推測では、どこにも @synthesize がないため、セッター/ゲッターはありません

それでもうまくいかない場合は、変数宣言を .h ファイルに移動する必要があります。とにかく .m にそれらを含める理由がわかりません

私はこれを参照します:

@interface Singleton ()
{
    NSString *variableA;
    NSString *variableB;
    NSString *variableC;
}
@end

編集: シングルトンを扱うときの 2 つの良い方法:

1)メソッド内で宣言してstatic ClassName *singleton、クラス内の他のメソッドが直接アクセスできず、次のように要求する必要がないようにします[[self class] sharedInstance];

2)スレッドセーフのためにdispatch_onceを使用する

+ (FooBar *)sharedInstance {
    static dispatch_once_t pred;
    static FooBar *_sharedInstance = nil;

    dispatch_once(&pred, ^{
        _sharedInstance = [[[self class] alloc] init];
    });

    return _sharedInstance;
}
于 2013-01-24T14:53:23.413 に答える
0

@property (readwrite) NSString *propertyA;
@property (readwrite) NSString *propertyB;
@property (readwrite) NSString *propertyC;

上記の変数にはセッターとゲッターがないと思います。つまり、それらを @synthesize する必要があります。

これが、以下のコードが PropertyA 値を設定しない理由です。

[[Singleton sharedInstance] setPropertyA:variableA];

于 2013-01-24T14:57:12.207 に答える