Разрешает ли Mac App Store создавать подклассы приватных методов? - PullRequest
1 голос
/ 17 августа 2011

В руководстве Mac App Store указано:

Приложения, использующие непубличные API, будут отклонены

Включает ли это подклассификацию публичных объектов с методами, которые не упомянуты в ссылках на их классы?

Ответы [ 3 ]

0 голосов
/ 17 августа 2011

Я бы настоятельно рекомендовал против этого.Вы не знаете, отклонит ли Apple ваше приложение за это (поэтому вы должны вернуться и исправить это), или они изменят частный метод (возможно, он не будет существовать в будущем, поэтому ваши приложения не будут работатькак и ожидалось в будущих версиях OS X (это относится и к iOS), а затем вам придется вернуться и исправить это).

В любом случае, одобряют или отклоняют ваше приложение, это плохая идея.

Что вы пытаетесь делать в любом случае?Может быть, есть лучший и безопасный способ сделать это.

0 голосов
/ 17 августа 2011

Apple не была полностью последовательной в этом отношении, но они отклонили некоторые приложения для этого.

0 голосов
/ 17 августа 2011

Почти все (но самые простые) хорошо спроектированные объекты будут иметь частные 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, который был бы отклонен.

...