2013-01-24 75 views
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); 
} 

感謝紅塔

回答

0

我的第一個猜測是,你沒有任何@synthesize任何地方,所以有沒有setter/getter方法

如果不工作,那麼你應該將你的變量聲明您的.h文件中,我不明白你爲什麼會對他們在您的m反正

我指的是這樣的:

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

編輯: 種兩次與單身人士打交道時的良好做法:

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; 
} 
+0

Xcode 4.4和更新的自動合成訪問器的屬性。 – Kreiri

0

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

我想上面的變量沒有setter和getters,意思是你會被要求對它們進行合成。

這就是爲什麼下面的代碼沒有設置PropertyA的值。

[[Singleton sharedInstance] setPropertyA:variableA];

+0

對不起,夥計們,我真的很想,但我不能指出問題所在。你能指導我一個小的Xcode教程,它的相關源代碼展示瞭如何設置和獲取單例值?非常感謝Regis – user1961175

相關問題