MacAppStoreのガイドラインには次のように記載されています。
非公開APIを使用するアプリは拒否されます
これには、クラスの参照に記載されていないメソッドを使用してパブリックオブジェクトをサブクラス化することも含まれますか?
MacAppStoreのガイドラインには次のように記載されています。
非公開APIを使用するアプリは拒否されます
これには、クラスの参照に記載されていないメソッドを使用してパブリックオブジェクトをサブクラス化することも含まれますか?
私はそれに対して強くお勧めします。Appleがアプリを拒否するのか(戻って修正する必要があるのか)、またはプライベートメソッドを変更するのか(将来的には存在しないため、アプリが機能しない可能性がある)はわかりません。将来のOSXバージョンで予想されるように(これはiOSにも当てはまります)、その後、戻って修正する必要があります)。
いずれにせよ、彼らがあなたのアプリを承認するか拒否するかにかかわらず、それは悪い考えです。
とにかく正確に何をしようとしていますか?たぶんそれを行うためのより良いそしてより安全な方法があります。
Appleはこの点で完全に一貫しているわけではありませんが、このためにいくつかのアプリを拒否しました。
ほとんどすべての(ただし最も単純な)適切に設計されたオブジェクトには、プライベート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メソッドにより、プライベートAPIメソッド- (void)doSomeWork;
が呼び出されます。私はそれをフレームワーククラスが直接呼んだわけではありません。代わりにこれを行った場合
MyClass *myClass = [[MyClass alloc] init];
[myClass doSomeWork];
次に、プライベートAPIを直接呼び出しますが、これは拒否されます。