Дает мне неправильную реализацию с моим синглтоном - PullRequest
0 голосов
/ 04 февраля 2012

Я решил попробовать синглтон для использования с локациями. Я получил то, что я думаю, синглтон работает правильно, но у меня есть одна ошибка, которая сейчас появляется Это говорит мне, что моя реализация не завершена. Это единственная ошибка, которую он мне дает, и я уверен, что это неправильно с моим заголовком или m файлом Я попробовал несколько вещей сейчас и не могу заставить его работать. Что мне здесь не хватает?

Вот мой заголовок

#import <UIKit/UIKit.h>

@interface TrackerViewController : UIViewController
-(void) locationUpdate;
end

А вот мой файл реализации:

#import "TrackerViewController.h"
#import "MyLocation.h"

@implementation TrackerViewController

NSString *LatCoord;
NSString *LongCoord;

- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
  // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
  [super viewDidLoad];
  [LocationController sharedInstance].locDelegate = (id)self;
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
  [super viewDidUnload];
  // Release any retained subviews of the main view.
  // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
  [super viewDidDisappear:animated];
}

- (void)locationUpdate:(CLLocation *)location {
    [[LocationController sharedInstance] setLocation:location];
    LatCoord  = [NSString stringWithFormat:@"%lf", location.coordinate.latitude];
    LongCoord = [NSString stringWithFormat:@"%lf", location.coordinate.longitude];
}

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation
{
  // Return YES for supported orientations
  return YES;
}

-(IBAction)CheckIn:(id)sender 
{
  [self locationUpdate];
}

@end

Мой одноэлементный заголовок выглядит следующим образом:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@protocol LocationControllerDelegate <NSObject>
@required
- (void)locationUpdate:(CLLocation*)location;
@end

@interface LocationController : NSObject <CLLocationManagerDelegate> {

  __unsafe_unretained id <LocationControllerDelegate> _locDelegate;

  CLLocationManager* locationManager;
  CLLocation* location;
  id locDelegate;
}

@property (nonatomic, retain) CLLocationManager* locationManager;
@property (nonatomic, retain) CLLocation* location;
@property (nonatomic, assign) id <LocationControllerDelegate> locDelegate;

+ (LocationController*)sharedInstance;

@end

Моя одноэлементная реализация выглядит следующим образом:

#import "MyLocation.h"

static LocationController* sharedCLDelegate = nil;

@implementation LocationController
@synthesize locationManager, location, locDelegate = _locDelegate;

- (id)init
{
 self = [super init];
 if (self != nil) {
   self.locationManager = [[CLLocationManager alloc] init];
   self.locationManager.delegate = self;
   self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
 }
 return self;
}

- (void)dealloc
{
 /* ... */
}

#pragma mark -
#pragma mark CLLocationManagerDelegate Methods
- (void)locationManager:(CLLocationManager*)manager
   didUpdateToLocation:(CLLocation*)newLocation
       fromLocation:(CLLocation*)oldLocation
{
 /* ... */
}

- (void)locationManager:(CLLocationManager*)manager
    didFailWithError:(NSError*)error
{
  /* ... */

}

#pragma mark -
#pragma mark Singleton Object Methods

+ (LocationController*)sharedInstance {
  @synchronized(self) {
    if (sharedCLDelegate == nil) {
    }
  }
  return sharedCLDelegate;
}

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

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


@end

Что я здесь упускаю или делаю неправильно?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2012

Я думаю, корень проблемы здесь:

@protocol LocationControllerDelegate <NSObject>
@required
- (void)locationUpdate:(CLLocation*)location;
@end

Итак, вы определили протокол с требуемым методом, но если я его не пропустил, вы не реализовали этот метод где-либо вобъект, который принимает этот протокол.Компилятор предупреждает вас, что вы не реализовали все необходимые методы протокола.

0 голосов
/ 04 февраля 2012

locationUpdate объявлен в вашем интерфейсе, но не определен в реализации.locationUpdate: определено - закрыть, но не совсем.

Примечание. Сообщение могло быть сохранено некоторое время.

0 голосов
/ 04 февраля 2012

Ваш синглтон выглядит неправильно.Ваш метод sharedInstance должен быть:

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

И вы можете избавиться от методов allocWithZone: и copyWithZone: они не делают ничего полезного.

Скорее всего, ваш класс нене работает, но, вероятно, не имеет ничего общего с предупреждением о "неполной реализации".Предупреждение будет, потому что вы забыли реализовать метод, который объявлен в вашем заголовке или в одном из ваших протоколов, или, возможно, вы ошиблись в нем.Я не смог определить его при первом проходе, но я еще раз посмотрю.

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

Кстати, строка ниже просачивается из-за того, что вы сохраняете дважды (init устанавливает для счетчика значение 1, а затем для присваиваемого свойства устанавливается значение 2).Вы должны запустить функцию анализа, которая добавит синие предупреждения для утечек, как это.

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

Вместо этого выполните одно из следующих действий:

//assign directly to the ivar so the setter method isn't used
locationManager = [[CLLocationManager alloc] init];

Или

//autorelease before assigning
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
...