CLLocationManager всегда равен нулю. -Делегатная реализация представляет собой класс Singleton (подкласс NSObject вместо подкласса UIViewController) - PullRequest
0 голосов
/ 20 января 2012

Можно ли поместить методы делегата CLLocationManager в класс Singleton, который является подклассом NSObject вместо UIViewController? Я хотел бы сделать это, так как я бы хотел вызвать Singleton из Делегата приложения и начать получать координаты, пока пользовательский интерфейс загружает

У меня есть класс locationcontroller, и в нем есть следующий код инициализации

static locationController *sharedLocController = NULL;
+(locationController *) getSharedController
{   
    if (sharedLocController !=nil)
    {
        NSLog(@"locationController has already been created.....");
        return sharedLocController;
    }
    @synchronized(self)
    {
        if (sharedLocController == nil)
        {
            sharedLocController = [[self alloc] init];

        }
    }
    return sharedLocController;
}
//==============================================================================
+(id)alloc
{

    @synchronized([locationController class])
    {

        NSAssert(sharedLocController == nil, @"Attempted to allocate a second instance of a sharedLocMgr singleton.");
        sharedLocController = [super alloc];
        return sharedLocController;
    }
    return nil;
}
//==============================================================================
-(id)init
{
    self = [super init];

    if(sharedLocController !=nil)
    {

        if(!self.locMgr)
        {
            [self initLocationManager];

        }
    }



    return sharedLocController;
}
//==============================================================================
-(void)initLocationManager
{


    self.locMgr = [[CLLocationManager alloc] init];

    self.locMgr.delegate = self;
    self.locMgr.distanceFilter = kCLDistanceFilterNone;
    self.locMgr.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locMgr startUpdatingLocation];
    NSLog(@"location manager object %@", locMgr);
}

Проблема в том, что объект self.locMgr всегда равен нулю. Спасибо

Ответы [ 2 ]

0 голосов
/ 20 января 2012

Избавьтесь от своей функции alloc. Это не обязательно и возвращает nil, что означает, что этот вызов init вызывается по указателю nil:

sharedLocController = [[self alloc] init];
0 голосов
/ 20 января 2012

Да, можно поместить их в подкласс NSObject, который может быть одиночным.Я использую что-то вроде:

@interface MyCLController : NSObject <CLLocationManagerDelegate> {
    CLLocationManager *locationManager;
}

...

@end

хотя на случай, если это не синглтон.

...