Mac App Store 指南规定:
使用非公开 API 的应用将被拒绝
这是否包括使用类参考中未提及的方法对公共对象进行子类化?
Mac App Store 指南规定:
使用非公开 API 的应用将被拒绝
这是否包括使用类参考中未提及的方法对公共对象进行子类化?
苹果在这方面并不完全一致,但他们为此拒绝了一些应用程序。
我强烈反对它。您不知道 Apple 是否会拒绝您的应用程序(因此您必须返回并修复它),或者他们是否会更改私有方法(可能将来不会存在,因此您的应用程序将无法运行正如未来 OS X 版本所预期的那样(这也适用于 iOS),然后你必须回去修复它)。
无论哪种方式,无论他们批准还是拒绝您的应用程序,这都是一个坏主意。
你到底想做什么?也许有更好更安全的方法来做到这一点。
几乎所有(但最简单的)设计良好的对象都有私有 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,这将被拒绝。