Objective-C:声明此委托的位置和其他查询

时间:2011-10-11 16:00:51

标签: objective-c ios xcode delegates protocols

我想找出一个委托专门指定为特定WWDC Live Demo Video中的属性的位置(注意:您需要Apple Developer登录才能访问该视频)。

下面列出了相关代码,因NDA原因省略了iOS 5属性限定符。我相信这个限定符与我的查询无关。

#import <UIKit/UIKit.h>
@class NSManagedObject;
@protocol CoffeeViewControllerDelegate;

@interface CoffeeViewController : UITableViewController
@property (_____,nonatomic) id <CoffeeViewControllerDelegate> delegate;
@end

@protocol CoffeeViewControllerDelegate <NSObject>
 // ...
@end

我的问题是:

  1. 委托声明为类成员的位置在哪里?
  2. NSObject协议对CoffeeViewControllerDelegate协议的继承是否意味着运行时检查委托是否具有所有NSObject方法?
  3. 为什么有必要转发声明NSManagedObject?这是使用核心数据时的常见要求吗?
  4. 非常感谢你的时间。

4 个答案:

答案 0 :(得分:3)

  1. 我认为这是一个LLVM(Apple新的GCC替换Objective-C编译器)功能,这意味着当你@synthesize属性时我就会创建变量(我对此不是100%肯定)
  2. 否。它将在编译时检查
  3. 您也可以#import <CoreData/CoreData.h>但是您的代码只需执行前向声明就可以更快地编译。基本上,它不需要知道除了它的大小之外的任何实现(它是一个对象,所以它是一个指针)

答案 1 :(得分:1)

1)当您指定没有类成员的属性时,objective c会自动为您创建一个私有成员。

2)它只是告诉你委托尊重这个协议。您必须在分配之前使用[delegate conformsToProtocol:@protocol(CoffeeViewControllerDelegate)]手动执行此检查。协议检查通常由编译器在编译时完成

3)因为你可以有循环导入问题。如果您只需要将您的实体用作类型,请使用前向声明,如果您使用此类实例的某种方法,则必须使用导入。

答案 2 :(得分:1)

  

委托声明为类成员的位置在哪里?

就在那里:

@property (_____,nonatomic) id <CoffeeViewControllerDelegate> delegate;

用于实现该属性的ivar是合成的(未在您提供的代码中显示),但这是目前的标准做法。

  

CoffeeViewControllerDelegate协议对NSObject协议的继承是否意味着运行时检查它   委托是否会出现所有NSObject方法?

不,我不认为这需要在运行时发生。编译器可以检查它。

  

为什么有必要转发声明NSManagedObject?这是一个   使用核心数据时的常见要求是什么?

在您想要引用类但不需要使用其接口的任何时候使用前向声明是很常见的。替代方案包括定义它的整个头文件,或整个框架的伞头。这只会减慢这里的速度 - 此时编译器所关心的是NSManagedObject指的是某个类。

答案 3 :(得分:-1)

您现在不需要明确声明_delegate ivar;您的实施只需要@synthesize delegate

您仍应在运行时检查委托是否符合预期的协议。

基于提供的代码片段,我认为不需要NSManagedObject的前向声明。