我看到Objective-C协议的使用方式如下:

@protocol MyProtocol <NSObject>

@required

@property (readonly) NSString *title;

@optional

- (void) someMethod;

@end

我见过使用这种格式来代替编写子类扩展的具体超类.问题是,如果你遵守这个协议,你需要自己合成属性吗?如果你要扩展一个超类,答案显然是否定的,你不需要这样做.但是如何处理协议需要符合的属性呢?

据我所知,您仍然需要在符合需要这些属性的协议的对象的头文件中声明实例变量.在这种情况下,我们能假设它们只是一个指导原则吗?显然,对于所需的方法,情况并非如此.编译器会因为你排除了协议列出的一个必需方法而责骂你.然而,房地产背后的故事是什么?

下面是一个生成编译错误的示例(注意:我对代码进行了裁剪,但没有考虑当前的问题):

我的协议.H

@protocol MyProtocol <NSObject>

@required
@property (nonatomic, retain) id anObject;

@optional

TestProtocolsViewController.H

- (void)iDoCoolStuff;

@end

#import <我的协议.H>

@interface TestProtocolsViewController : UIViewController <MyProtocol> {

}

@end

TestProtocolsViewController.M

#import "TestProtocolsViewController.H"

@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.

- (void)dealloc {
    [anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
    [super dealloc];
}

@end     

推荐答案

协议只是告诉所有通过协议了解你的类的人,财产anObject将在那里.协议不是真实的,它们本身没有变量或方法——它们只描述了一组特定的属性,这些属性对于类来说是真实的,因此持有对它们的引用的对象可以以特定的方式使用它们.

这意味着在符合协议的课堂上,你必须尽一切努力确保一个对象正常工作.

@property@synthesize在本质上是为您生成代码的两种机制.@property只是表示该属性名将有一个getter(和/或setter)方法.如今,单是@property个就足以让系统为您创建方法和存储变量(您过go 必须添加@sythesize个).但是你必须有一些东西来访问和存储变量.

Objective-c相关问答推荐

如果DISPATCH_SOURCE_SET_EVENT_HANDLER中的SELF需要为弱

当我们只能使用 NSObject 时,为什么还要使用 id?

在从 UIViewController 调用的非保留完成中引用 self 时,weakSelf/strongSelf 舞蹈真的有必要吗?

使用正则表达式搜索 NSString

将 NSInteger 变量传递给 NSMutableDictionary 或 NSMutableArray

UITableViewCell 突出显示时使标签的背景清晰

负数的奇怪 Objective-C Mod 行为

调用了dismissViewControllerAnimated,但没有解除ViewController

UIDatePicker,根据今天的日期设置最大和最小日期

如何与 UITableView 一起滚动标题?

如何删除应用程序指定目录中的所有文件?

检测代码是否在 Objective-C 的主线程上运行的正确方法是什么? (iOS)

iOS:如何将 UIViewAnimationCurve 转换为 UIViewAnimationOptions?

distanceFromLocation - 计算两点之间的距离

如何删除手势识别器

WKWebView 判断 JavaScript 返回值

带有块的 Objective-C 延迟动作

使用 respondsToSelector 时 suppress '...' is deprecated

在 iOS 7 上运行应用程序时显示黑条(4 英寸视网膜显示屏)

如何判断 NSString 的最后一个字符