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
。