我多次使用@protocols
,但我认为我一直都在做错。他们总是工作得很好,但现在我想提高自己的水平,所以我想尽力做好。
我总是创建一个像这样的委托:
@protocol CommentViewDelegate;
@interface LZCommentView : UIView
@property (assign, nonatomic) id <CommentViewDelegate> delegate;
@end
@protocol CommentViewDelegate
-(void)showAndHideCommentView;
@end
现在,我已经看到我看到的几乎所有委托方法都发送了自己的对象。像这样:
-(void)showAndHideCommentView:(LZCommentView *)commentView;
我做了什么和这个有什么区别?其中一个比另一个好吗?我已经看到几乎所有这样做的人都没有使用ViewController
中的对象。
另一个问题是,我应该在<NSObject>
定义中使用@protocol
吗?
最后一个,最好用property
或assign
创建@ strong
?
谢谢
答案 0 :(得分:1)
1)您应该始终使您的协议符合NSObject
协议。这使您可以使用该协议中的所有方法。
@protocol CommentViewDelegate <NSObject>
2)除非您有充分的理由不这样做,否则代表的大多数属性应定义为weak
。这样可以避免引用周期,并确保在委托对象被释放时委托自动设置为nil
。
@property (nonatomic, weak) id<CommentViewDelegate> delegate;
3)最好将对象包含在协议方法中,因为它提供了最大的灵活性。它还允许类成为多个实例的委托。然后,类可以告诉调用协议方法的实例。可以想象一个视图控制器处理多个按钮或有两个或多个表视图。
答案 1 :(得分:1)
通常,可以使用传递给委托的对象,以便可以在不同的上下文中使用相同的委托类。在委托类可能被重用的情况下,这为您提供了更大的灵活性。
例如,如果showAndHideCommentView
需要与正在显示或隐藏的视图进行交互,则有两种方法:
第一种方法的例子:
@implementation MyDelegate
-(void)showAndHideCommentView:(LZCommentView *)commentView {
if (isShowing) {
[commentView doSomething];
}
}
@end
第二种方法的例子:
@implementation MyDelegate
-(void)showAndHideCommentView {
if (isShowing) {
[self.commentView doSomething];
}
}
@end
第一种方法比第二种方法更灵活,因为它允许您重用相同的代码。
根据Apple,it’s best practice to define your protocols to conform to the NSObject
protocol,所以第二个问题的答案是肯定的。
就第三个问题而言,声明委托属性的最佳方法是使用weak
属性以避免保留周期。