Ios 一直给我的singleton错误的实现

Ios 一直给我的singleton错误的实现,ios,xcode,ios5,xcode4.2,Ios,Xcode,Ios5,Xcode4.2,我决定试着制作一个用于地点的单件。我已经得到了我认为是的,单件工作正常,但我有一个错误,现在正在出现。它告诉我我的实现是不完整的。这是它给我的唯一错误,我确信这是我的视图头或m文件的错误。我现在已经试过一些方法,但无法使其发挥作用。我错过了什么 这是我的头 #import <UIKit/UIKit.h> @interface TrackerViewController : UIViewController -(void) locationUpdate; end 我的单例标题如下:

我决定试着制作一个用于地点的单件。我已经得到了我认为是的,单件工作正常,但我有一个错误,现在正在出现。它告诉我我的实现是不完整的。这是它给我的唯一错误,我确信这是我的视图头或m文件的错误。我现在已经试过一些方法,但无法使其发挥作用。我错过了什么

这是我的头

#import <UIKit/UIKit.h>

@interface TrackerViewController : UIViewController
-(void) 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

我在这里错过了什么或做错了什么?

你的单身汉看起来错了。您的sharedInstance方法应为:

+ (LocationController*)sharedInstance {
  @synchronized(self) {
    if (sharedCLDelegate == nil) {
      sharedCLDelegate = [[self alloc] init];
    }
  }
  return sharedCLDelegate;
}
您可以去掉allocWithZone:和copyWithZone:方法——它们没有做任何有用的事情

这很可能是类无法工作的原因,但可能与“未完成实现”警告无关。警告将是因为您忘记实现在标头或协议中声明的方法,或者可能是拼写错误。我在第一次传球时看不出来,但我会再看一看

如果双击标题中的黄色警告图标,它会告诉您哪些方法没有正确实现

顺便说一下,下面的行泄漏是因为您使用了双重保留(init将retain count设置为1,然后将其指定给retained属性将其设置为2)。您应该运行Analyze函数,该函数将为此类泄漏添加蓝色警告

self.locationManager = [[CLLocationManager alloc] init];
请改为执行以下操作之一:

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


我认为问题的根源在于:

@protocol LocationControllerDelegate <NSObject>
@required
- (void)locationUpdate:(CLLocation*)location;
@end
@protocol LocationControllerDelegate
@必需的
-(void)位置更新:(CLLocation*)位置;
@结束

因此,您已经用一个必需的方法定义了一个协议,但是除非我错过了它,否则您还没有在采用该协议的对象中的任何地方实现该方法。编译器警告您尚未实现协议的所有必需方法。

locationUpdate
在接口中声明,但未在实现中定义<代码>位置更新:已定义--关闭,但不完全关闭


注意:该消息可能节省了一些时间。

您已经解释了如何实现共享对象,但没有解释单例。singleton是一个不能多次实例化的类。重写
-allocWithZone:
-copyWithZone:
的目的是强制执行单一实例化规则。是的,从技术上讲,但大多数说他们想要单一实例的人实际上想要一个共享实例,从这段代码判断,这就是JESLAB想要的。好的,我已经按照你和@Caleb所说的去做了,但是我仍然无法让它启动定位服务,即使现在我的代码中没有任何错误。你能推荐一个关于单身汉和地点的不错的教程吗?谢谢你的回答。我从你们每个人身上学到了一些东西。我选择Nick的答案作为最佳答案,因为它更接近于我实际要做的事情;实现有一个参数。该代码还调用了无参数的[self-locationUpdate];这没有任何作用。我在代码中没有看到任何实现LocationControllerDelegate的类,所以你不会期望看到它在任何地方实现。好的,我已经按照你和@NickLockwood所说的去做了,但我仍然无法让它启动定位服务,即使现在我的代码中没有任何错误。您是否可以推荐一个关于单身人士和地点的不错的教程?为什么您要与您的学员一起使用
\u unsafe\u unretained
?我认为
\uuuu-weak
将是更好的选择。\uuuu-weak在iOS 4上不起作用,因此大多数人会使用不安全的unrepaired。
//autorelease before assigning
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
@protocol LocationControllerDelegate <NSObject>
@required
- (void)locationUpdate:(CLLocation*)location;
@end