首先请看下面的代码
CoreLocationController.h
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@protocol CoreLocationControllerDelegate // Line 1
@required
- (void)locationUpdate:(CLLocation *)location;
- (void)locationError:(NSError *)error;
@end
/* Declare class named CoreLocationControll and inherited from CLLocationManagerDelegate */
@interface CoreLocationController : NSObject <CLLocationManagerDelegate> {
CLLocationManager *locMgr;
id delegate;
}
@property (nonatomic, retain) CLLocationManager *locMgr; // claim setter and getter for locMgr
@property (nonatomic, assign) id delegate; // claim setter and getter for delegate
@end
CoreLcationController.m
#import "CoreLocationController.h"
@implementation CoreLocationController
@synthesize locMgr, delegate;
/* Is triggered by - (void)startUpdatingLocation from CoreLocationDemoViewController.m*/
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"CORE_LOCATION_CONTROLLER=======>DID_UPDATE_TO_LOCATION");
if([self.delegate conformsToProtocol:@protocol(CoreLocationControllerDelegate)]) // line 2
[self.delegate locationUpdate:newLocation];
}
我的问题是第1行和第2行的作用以及原因 我查了一下CoreLocationControllerDelegate但没有参考
答案 0 :(得分:0)
您询问的行是objective-c协议声明。该代码声明了一个名为CoreLocationControllerDelegate的协议。简单来说,协议是一个方法列表,如果符合协议,则可以期望给定对象实现。
例如,UITextFieldDelegate协议包含对象应该或必须实现的各种方法,如果它想要成为文本字段的委托。
第1行@required
表示对象必须实现以下方法才能符合协议。如果您将对象声明为符合协议,则必须实现这些方法,否则您将遇到构建错误(或警告,我不记得哪些)。
第2行是一个安全检查,用于确保委托在调用委托方法之前符合协议(在这种情况下,它实现了所需的方法)。这可以防止将无法识别的选择器发送到对象的运行时崩溃。