我是协议代表的新手,我正在尝试理解下面两种符号之间的区别。
在我的协议委托文件中,我定义了
@interface SampleProtocol : NSObject
{
id <SampleProtocolDelegate> delegate;
}
这给了我一个警告,所以我将这段代码更改为
@interface SampleProtocol : NSObject
{
id <SampleProtocolDelegate> _delegate;
}
它按照我的意图运作。所以我想知道为什么语法是 id _delegate ,而我看到的大多数教程只是协议定义中的 id delegate ?
答案 0 :(得分:2)
您还有一个名为delegate
的属性,但未包含明确的@synthesize
。隐式合成创建名为_propertyName
的后备实例变量。如果您创建名为propertyName
的实例属性,编译器就会警告您将存在两个实例变量。
如果您有属性,则不必自己创建实例变量。编译器将为您创建一个。让你的代码更清洁。
答案 1 :(得分:0)
您总是希望使用前导下划线命名ivars。如果您创建属性,编译器将自动为您创建下划线ivar。举例说明:
此代码:
// header
@interface MyGreatClass : NSObject
@property NSInteger someNumber;
@end
// implementation
@implementation MyGreatClass
@end
与此相同:
// header
@interface MyGreatClass : NSObject {
NSInteger _someNumber;
}
- (void)setSomeNumber:(NSInteger)someNumber;
- (NSInteger)someNumber;
@end
// implementation
@implementation MyGreatClass
- (void)setSomeNumber:(NSInteger)someNumber
{
_someNumber = someNumber;
}
- (NSInteger)someNumber
{
return _someNumber
}
@end
不需要@synthesize
关键字。
还有一件事:除非你创建一个代表类似网络协议的类,否则请注意协议类似于Java中的接口:https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html