如何围绕Objective-C中缺乏“朋友”能力进行编程?

时间:2011-09-11 12:07:53

标签: objective-c

假设我有3个类,一个控制器对象Controller和两个模型对象FooBar

假设FooBar有一个stop方法,该方法只能由Controller方法调用,而不是由其他类直接调用

如何使其成为如果任何其他类直接在stopFoo上调用Bar,它们(理想情况下)得到编译时警告或(次佳)运行时警告?

注意,这是为了阻止意外调用错误的方法,而不是需要安全的东西。如果需要,可以重写stop方法,但不必这样做。

我目前的想法是:

1)在ControllerFoo上定义Bar类别,然后在那里移动停止方法。把它放在一个单独的文件中,所以你不得不自己导出它(但是如果有人这样做的话,这不会导致编译警告 - 但至少应该更清楚地说这不是预期的使用方法班级)

2)在方法中添加sender参数,并在运行时检查它是[Controller class]类型。

但这些都不是理想的,因为它们都容易出错。对于这种事情,是否有更好的客观模式?

2 个答案:

答案 0 :(得分:3)

您可以在一个单独的文件中添加一个类别(例如:@interface Foo (Friends)),您可以在其中声明只能由Controller使用的方法。

富+ Friends.h:

@interface Foo (Friends)
-(void)stop;
@end

Foo + Friends.m或Foo.m:

#import "Foo+Friends.h"
@implementation Foo (Friends)
-(void)stop{
    // implementation for stop
}
@end

在导入“Foo + Friends.h”的文件中(在您的情况下为Controller.m),您可以在不发出任何警告的情况下访问stop方法。

答案 1 :(得分:1)

一种选择可能是在-stop方法中无条件地抛出异常。正确调用该方法的代码将捕获异常并忽略它;天真地调用它的代码不会期望异常,并且可能会因未捕获的异常错误而崩溃。

当没有什么是真正的错误时,我并没有为抛出异常而疯狂,但是你担心可能错误,所以它并不可怕。

更好的选择是考虑为什么要限制-stop对Controller类的使用,并尝试重构代码以避免这种情况。模型对象不应该知道有关使用它们的控制器的任何信息,因此消除这种依赖性似乎是一个好主意。