委托方法发送自己的对象或没有它

时间:2014-03-14 01:50:45

标签: ios objective-c delegates protocols nsobject

我多次使用@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吗?

最后一个,最好用propertyassign创建@ strong

谢谢

2 个答案:

答案 0 :(得分:1)

1)您应该始终使您的协议符合NSObject协议。这使您可以使用该协议中的所有方法。

@protocol CommentViewDelegate <NSObject>

2)除非您有充分的理由不这样做,否则代表的大多数属性应定义为weak。这样可以避免引用周期,并确保在委托对象被释放时委托自动设置为nil

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

3)最好将对象包含在协议方法中,因为它提供了最大的灵活性。它还允许类成为多个实例的委托。然后,类可以告诉调用协议方法的实例。可以想象一个视图控制器处理多个按钮或有两个或多个表视图。

答案 1 :(得分:1)

通常,可以使用传递给委托的对象,以便可以在不同的上下文中使用相同的委托类。在委托类可能被重用的情况下,这为您提供了更大的灵活性。

例如,如果showAndHideCommentView需要与正在显示或隐藏的视图进行交互,则有两种方法:

  1. 以视图形式获取视图,或
  2. 直接引用视图,知道此委托已附加到特定视图。
  3. 第一种方法的例子:

    @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属性以避免保留周期。