什么是目标c中用于创建对象和设置其属性的最佳实践

时间:2013-06-25 12:03:13

标签: iphone objective-c uiviewcontroller enums

考虑到我有UIViewController名为ErrorViewController,我使用initWithNibName进行实例化。

ErrorViewController上有一个枚举,用于描述其“类型”。

ErrorViewController有一个委托函数返回其委托,该委托将根据ErrorViewController上设置的类型进行响应。

最好是在新的initWithNibName函数中传递所有参数,并在ErrorViewController上设置私有属性。像这样:

ErrorViewController *errorVc = [[ErrorViewController alloc] 
initWithNibName:@"ErrorViewController" bundle:nil 
andErrorType:kErrorTypeA andDelegate:self];

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
andErrorType:(ErrorType)errorType andDelegate:(id<ErrorDelegate>)delegate{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.delegate = delegate;
        self.errorType = errorType;
    }
    return self;
}

或者更好地实例化对象,然后像下面这样设置它的公共属性:

ErrorViewController *errorVc = [[ErrorViewController alloc] 
initWithNibName:@"ErrorViewController" bundle:nil];
errorVc.delegate = self;
errorVc.type = kErrorTypeA.

关于委托方法,最佳做法是通过传递参数或通过检查传递的控制器的属性来检查类型,如下所示:

- (void)ErrorPage:(ErrorViewController *)ErrorPage 
// check ErrorPage.errorType
}

或者这个:?

- (void)ErrorPage:(ErrorViewController *)ErrorPage 
andErrorType:(ErrorType)errorType
// check errorType
}

1 个答案:

答案 0 :(得分:2)

我认为这是一个偏好问题。如果对象无法正确运行而没有错误类型和/或委托,则最好提供自定义初始化程序。

至于你的第二个问题,我会提供第二个例子中的错误类型。请注意,方法名称应该以小写字符开头(-errorPage:而不是-ErrorPage:)。

另外,如果你经常使用它,我会提供一个方便类方法来创建对象:

+(ErrorViewController*) standardErrorViewControllerWithErrorType: (ErrorType) errorType andDelegate: (id<ErrorDelegate>) delegate {

  ErrorViewController *evc = [[ErrorViewController alloc] initWithNibName: @"ErrorViewController" bundle: nil andErrorType: errorType andDelegate: delegate];
return evc;
}

修改

此外,在您的init方法中,我们鼓励您使用-(instancetype) init...代替-(id) init....