1

我是 Objective-c 的新手,对委托的使用方式非常困惑。我遇到了这段代码,我想用它来澄清一些疑问。

#import <Foundation/Foundation.h>

@protocol ProcessDataDelegate <NSObject>

@required
- (void) processSuccessful: (BOOL)success;

@end

@interface ClassWithProtocol : NSObject 
{
  id <ProcessDataDelegate> delegate;
}

@property (retain) id delegate;

 -(void)startSomeProcess;

@end

在这里,有 2 处对“代表”一词的引用,任何人都可以解释在“id 角括号委托角括号封闭”的上下文中使用它的含义吗?

同样,有一个名为 delegate 的属性。它不应该引起任何冲突吗?

提前致谢,

4

2 回答 2

2

不,只有一个属性,由@property (retain) id delegate;定义的那个。另一个是(某种)私有变量,NSObject它不是objective-c意义上的属性......然后,你@synthetize的.m文件中有关键字,它扩展了属性。

另一种表示法id<protocol>是,委托应该符合某个协议。

您可以从班级访问两者,但您只能从外部访问属性。此外,对于一个属性,还会生成一些其他的东西——在保留(不使用 ARC 时)的情况下,内存管理例程。

为了完成(混乱?)讲座,有一个很好的方法来拥有类私有属性,当你在 .m 文件中定义它们而不是在匿名类别中的 .h 中定义它们时,例如:

@interface MyClass()

@property (nonatomic, retain) NSString privateString;

@end

@implementation
@synthetize privateString;

// ...

@end
于 2012-07-31T23:28:34.893 回答
2

这一行:

id <ProcessDataDelegate> delegate;

表示有一个名为 的实例变量delegate,它可以是您喜欢的任何类型的对象,只要该对象采用ProcessDataDelegate协议即可。

后面以@property 开头的行只是为该类声明一个Objective-C 2.0 属性,该属性恰好与实例变量具有相同的名称。这不是冲突。属性的声明只是委托实例变量的 getter/setter 方法的快捷方式。

更现代的 obj-c 用法是这样的:

@interface ClassWithProtocol : NSObject

@property (retain) id<ProcessDataDelegate> delegate;

- (void)startSomeProcess;

@end

您可以在Apple 的 Objective-C 语言文档中阅读有关这些内容的所有内容。

于 2012-07-31T23:35:41.823 回答