Определение ваших частных методов в @implementation
блок идеально подходит для большинства целей. Clang увидит их в пределах @implementation
, независимо от порядка объявления. Нет необходимости объявлять их в продолжении класса (например, расширения класса) или названной категории.
В некоторых случаях вам необходимо объявить метод в продолжении класса (например, при использовании селектора между продолжением класса и @implementation
).
static
функции очень хороши для особо чувствительных или скоростных критических частных методов.
Соглашение об именах префиксов может помочь вам избежать случайного переопределения частных методов (я нахожу имя класса в качестве префиксного безопасного).
Именованные категории (например, @interface MONObject (PrivateStuff)
) не являются особенно хорошей идеей из-за потенциальных конфликтов имен при загрузке. Они действительно полезны только для друзей или защищенных методов (что очень редко бывает хорошим выбором). Для того, чтобы убедиться, что вы предупреждены о неполной реализации категории, вы должны на самом деле осуществить это:
@implementation MONObject (PrivateStuff)
...HERE...
@end
Вот немного аннотированный шпаргалка:
MONObject.h
@interface MONObject : NSObject
// public declaration required for clients' visibility/use.
@property (nonatomic, assign, readwrite) bool publicBool;
// public declaration required for clients' visibility/use.
- (void)publicMethod;
@end
MONObject.m
@interface MONObject()
@property (nonatomic, assign, readwrite) bool privateBool;
// you can use a convention where the class name prefix is reserved
// for private methods this can reduce accidental overriding:
- (void)MONObject_privateMethod;
@end
// The potentially good thing about functions is that they are truly
// inaccessible; They may not be overridden, accidentally used,
// looked up via the objc runtime, and will often be eliminated from
// backtraces. Unlike methods, they can also be inlined. If unused
// (e.g. diagnostic omitted in release) or every use is inlined,
// they may be removed from the binary:
static void PrivateMethod(MONObject * pObject) {
pObject.privateBool = true;
}
@implementation MONObject
{
bool anIvar;
}
static void AnotherPrivateMethod(MONObject * pObject) {
if (0 == pObject) {
assert(0 && "invalid parameter");
return;
}
// if declared in the @implementation scope, you *could* access the
// private ivars directly (although you should rarely do this):
pObject->anIvar = true;
}
- (void)publicMethod
{
// declared below -- but clang can see its declaration in this
// translation:
[self privateMethod];
}
// no declaration required.
- (void)privateMethod
{
}
- (void)MONObject_privateMethod
{
}
@end
Другой подход, который может быть неочевидным: тип C++ может быть ботом h очень быстро и обеспечивают гораздо более высокую степень контроля, минимизируя количество экспортированных и загруженных методов objc.
Люди могут найти этот вопрос интересным: http://stackoverflow.com/questions/2158660/why-doesnt-objective-c-support-private-methods – bbum 2010-03-03 18:35:50
Почему бы просто [опустить объявление частного метода] (http://stackoverflow.com/questions/6767129/objective-c-should-i-declare-private-methods)? – ma11hew28 2011-07-20 19:06:43