Ios 目标C代表声明

Ios 目标C代表声明,ios,objective-c,delegates,Ios,Objective C,Delegates,有人能告诉我两者的区别吗 @property (nonatomic, weak) id delegate; @property (nonatomic, weak) id <protocol_name> delegate; @property (nonatomic, weak) UIViewController * <protocol_name> delegate; @属性(非原子,弱)id委托; @属性(非原子,弱)id委托; @属性(非原子,弱)UIViewCo

有人能告诉我两者的区别吗

@property (nonatomic, weak) id delegate;

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

@property (nonatomic, weak) UIViewController * <protocol_name> delegate;
@属性(非原子,弱)id委托;
@属性(非原子,弱)id委托;
@属性(非原子,弱)UIViewController*委托;
@属性(非原子,弱)id委托

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

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

这说明当前类的对象有一个委托,该委托可以是任何类型(id),但必须符合
protocol\u name
protocol。这尤其有用,因为包含委托的类知道它可以向其委托发送特定消息,并且“知道”委托将响应这些消息

@property(非原子,弱)UIViewController*委托

这与第二个示例相同,只是委托必须是类
UIViewController
的对象。实际上,
delegate
对象的类型通常是
id
,尽管这不是一个要求-它只是为程序员提供了更大的自由度


编辑:协议

假设您声明了一个类,如下所示:

@interface MyObject : NSObject <MyDelegateProtocol>
// ...
@end
这意味着任何“符合”MyDelegateProtocol的对象必须实现称为
-(void)method1
-(void)method2
的方法。并且,可选地,可以包括消息
-(void)method3
的实现

这对于委托对象来说是非常有用的信息(顺便说一句,协议名称可以是任何名称,我只是添加了“delegate”一词,以明确它被用作委托协议)

如果另一个类现在定义:

@property (nonatomic, weak) id<MyDelegateProtocol> delegate;
-method1
-method2
不需要检查,因为这些方法是协议定义所要求的
@required
,它可以随时调用它们

一个类一次也可以使用多个协议(例如,
)-有关协议的更完整概述,请查看第一个示例中的。

@property (nonatomic, weak) id delegate;
@property (nonatomic, weak) UIViewController * < protocol_name > delegate;
您创建了一个id类型的属性,该属性在目标c中为“any”类型,名称为-delegate

第二个例子:

@property (nonatomic, weak) id < protocol_name > delegate;
@property(非原子,弱)id委托;
您创建了一个id类型的属性,该属性需要符合协议\u name protocol with name-delegate

最后一个例子:

@property (nonatomic, weak) id delegate;
@property (nonatomic, weak) UIViewController * < protocol_name > delegate;
@property(非原子,弱)UIViewController*委托;
创建UIViewController类型的属性(指向UIViewController的指针),该属性需要符合协议\u name protocol with name-delegate

@属性(非原子,弱)id委托

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

@属性(非原子,弱)id委托

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

@属性(非原子、弱)UIViewController*委托


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

非常感谢,但是第一个声明是否意味着类的对象“不必”符合协议,因为我没有使用过???@Pr33tham,正确,第一个属性(仅使用
id
)不需要任何东西(在调用任何方法之前需要检查)。我使用的是XCode 6.2。要声明UIViewController类型的委托,正确的格式是
UIViewController*delegate