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