目标C代表声明

时间:2014-04-16 10:19:02

标签: ios objective-c delegates

有人可以告诉我

之间的区别
@property (nonatomic, weak) id delegate;

@property (nonatomic, weak) id  <protocol_name> delegate;

@property (nonatomic, weak) UIViewController * <protocol_name> delegate;

3 个答案:

答案 0 :(得分:31)

  

@property (nonatomic, weak) id delegate;

这指定当前类的对象具有可以是任何类型的委托。 weak说明符对于委托对象是常见的,因为它意味着具有委托的对象不会增加委托的引用计数(在ARC中说&#34;保留对它的强引用&#34;) 。 weak委托参考是标准做法。

  

@property (nonatomic, weak) id < protocol_name > delegate;

这一细节表明当前类的对象具有可以是任何类型(id)的委托,但必须符合protocol_name协议。这特别有用,因为包含委托的类知道它可以发送给它的委托的特定消息和&#34;知道&#34;代表将回复他们。

  

@property (nonatomic, weak) UIViewController * < protocol_name > delegate;

除了委托必须是类UIViewController的对象之外,这与第二个示例相同。在实践中,delegate对象通常是id类型,虽然这不是必需的 - 它只为程序员提供了更大的自由。


编辑:协议

我们假设您按如下方式声明一个类:

@interface MyObject : NSObject <MyDelegateProtocol>
// ...
@end

此声明中的<MyDelegateProtocol>表示MyObject实施MyDelegateProtocol协议中定义的方法(即符合协议&#39;)。

协议定义(显然在类定义之前)可能如下所示:

@protocol MyDelegateProtocol <NSObject>
@required
- (void)method1;
- (void)method2;
@optional
- (void)method3;
@end

这意味着任何符合条件的对象都是符合要求的。 MyDelegateProtocol协议必须实施名为-(void)method1-(void)method2的方法。并且,可选,可以包含消息-(void)method3的实现。

这对于委托对象来说是非常有用的信息(协议名称可以是任何东西,我只是包含“委托”这个词,以明确它被用作委托协议)。 / p>

如果另一个班级现在定义:

@property (nonatomic, weak) id<MyDelegateProtocol> delegate;

知道它可以依赖-method1-method2的实现由其代理实现,-method3 可以也可以实现(可以使用以下代码进行检查:)

if ([self.delegate respondsToSelector:@selector(method3)]) {
    [self.delegate method3];
}
else {
    // Delegate doesn't implement -method3.
}

-method1-method2不需要检查,因为这些方法是@required协议定义,并且可以随时调用它们。

一个类一次也可以使用多个协议(例如<Proto1, Proto2, UITableViewDelegate>) - 有关协议的更完整概述,请查看Apple Docs on protocols

答案 1 :(得分:5)

  

@property(非原子,弱)id委托;

没有特定类型或协议实现的属性。在delegate上调用方法时,任何事情都会发生 - 编译器会信任你,如果它可以看到某个方法存在,运行时会检查你是否在撒谎。

  

@property(非原子,弱)id&lt; protocol_name&gt;委派;

没有特定类型但实现指定协议的属性。您只能从该协议调用方法(除非您进行一些转换)。设置为属性的任何实例必须符合协议(或者,您需要一些转换)。

  

@property(非原子,弱)UIViewController *&lt; protocol_name&gt;委派;

具有特定类型(UIViewController)且实现指定协议的属性。您只能从该协议和UIViewController类调用方法(除非您进行一些转换)。设置为属性的任何实例都必须符合协议并且是UIViewController的子类(或者,您需要一些转换)。

答案 2 :(得分:1)

在第一个例子中:

@property (nonatomic, weak) id delegate;

你创建了一个id类型的属性,它是带有name - delegate的目标c中的'any'类型。

第二个例子:

@property (nonatomic, weak) id < protocol_name > delegate;

你创建了一个id类型的属性,它需要符合protocol_name协议和name - delegate。

最后一个例子:

@property (nonatomic, weak) UIViewController * < protocol_name > delegate;

你创建了一个UIViewController类型的属性(指向UIViewController的指针),它需要符合protocol_name协议和name - delegate。