1

Mac App Store 指南规定:

使用非公开 API 的应用将被拒绝

这是否包括使用类参考中未提及的方法对公共对象进行子类化?

4

3 回答 3

0

苹果在这方面并不完全一致,但他们为此拒绝了一些应用程序。

于 2011-08-17T15:58:11.953 回答
0

我强烈反对它。您不知道 Apple 是否会拒绝您的应用程序(因此您必须返回并修复它),或者他们是否会更改私有方法(可能将来不会存在,因此您的应用程序将无法运行正如未来 OS X 版本所预期的那样(这也适用于 iOS),然后你必须回去修复它)。

无论哪种方式,无论他们批准还是拒绝您的应用程序,这都是一个坏主意。

你到底想做什么?也许有更好更安全的方法来做到这一点。

于 2011-08-17T15:54:06.540 回答
-1

几乎所有(但最简单的)设计良好的对象都有私有 API。这就是封装的全部思想。

我的猜测是,当您对框架类进行子类化时,您的代码仍然只调用该类的公共 API,因此您自己不会调用任何私有 API。如果不是这种情况,那么肯定没有人能够使用 Cocoa 和 Cocoa-touch 框架发布任何软件。

如果您继承并故意调用私有方法,那么这当然是违规行为

举这个例子

/*
 * This is a framework class that needs to be subclassed
 * it has one public method  - (void)save;
 * and one private method    - (void)doSomeWork;
 */
@interface FrameWorkClass : NSObject

- (void)save;

@end

@interface FrameWorkClass ()

//private 
- (void)doSomeWork;

@end

@implementation FrameWorkClass

- (void)save
{
  [self doSomeWork]; // Call to private method
}

@end

/*
 * This is our subclass of FrameWorkClass
 */
@interface MyClass : FrameWorkClass
// more methods
@end

如果我这样做

MyClass *myClass = [[MyClass alloc] init];
[myClass save];

save 方法导致- (void)doSomeWork;调用私有 API 方法。我没有直接调用它框架类。如果我这样做了

MyClass *myClass = [[MyClass alloc] init];
[myClass doSomeWork];

然后我将直接调用私有 API,这将被拒绝。

于 2011-08-17T15:50:57.320 回答