как сделать единственный метод в классе приватным в Objective-c?
как сделать единственный метод в классе приватным в Objective-c?
Ответы (4)
В Objective-C нет концепции частных методов. Однако вы можете запретить использование метода в файле заголовка и добавить категорию в частный файл.
Обычно это выглядит так:
@interface MyObject : NSObject {
// ivars
}
// public methods
@end
// usually in a seperate file
@interface MyObject ()
// private methods
@end
Пустое имя категории означает, что это class extension, это сообщает компилятору, что метод требуется в основном блоке реализации.
Строго говоря, в Objective-C нельзя создавать частные методы; но вы можете создать категорию в файле, содержащем реализацию (MyClass.m
), скрывая ее от файла заголовка (MyClass.h
).
//MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
}
@end
Файл реализации:
//MyClass.m
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod {
return;
}
@end
Objective-C изначально не поддерживает частные методы.
Однако вы можете добиться управления частным методом, используя «расширения классов» (анонимные категории).
Основная идея состоит в том, чтобы объявить расширение класса с вашими частными методами внутри файла реализации для вашего класса (а не его заголовка), но за пределами вашего блока @implementation. Затем вы можете реализовать методы, и никакой внешний класс не сможет их увидеть. Нравится:
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod
{
//implementation goes here
}
-(void)someOtherMethod
{
[self myPrivateMethod];
}
@end
Использование расширения класса вынуждает вас реализовать методы в основном блоке @implementation и требует, чтобы они были реализованы (как если бы они были объявлены в основном блоке @interface в заголовке).
К сожалению, из-за динамической природы Objective-C это фактически не предотвратит вызов этих методов другими классами. Они получат предупреждение о том, что класс может не отвечать на сообщение, но во время выполнения он будет работать. Единственное, что это дает вам, - это возможность скрыть методы от других программистов.
Вы не можете. Только переменные экземпляра могут быть помечены как частные.
Хотя есть способы сделать что-то эквивалентное частным методам. Общая идея заключается в том, что вы объявляете закрытый метод не в заголовке, а в файле реализации.
Следовательно, если вы хотите иметь общедоступный (myPublicMethod) и частный (myPrivateMethod) методы, ваш заголовок может выглядеть следующим образом:
@interface MyClass {
}
- (void)myPublicMethod;
@end
И тогда у вас есть три варианта файла реализации:
1.
Не объявляйте метод ни в каком разделе @interface и просто убедитесь, что он реализован, прежде чем он будет использоваться в разделе @implementation.
@implementation MyClass
- (void)myPrivateMethod { }
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end
2.
Используйте анонимную категорию в вашем файле реализации, чтобы объявить частные методы и реализовать их в основном блоке @implementation.
@interface MyClass ()
- (void)myPrivateMethod;
@end
@implementation MyClass
- (void)myPrivateMethod { }
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end
3.
Используйте обычную категорию в вашем файле реализации и реализуйте частные методы в отдельном блоке @implementation.
@interface MyClass (PrivateMethods)
- (void)myPrivateMethod;
@end
@implementation MyClass (PrivateMethods)
- (void)myPrivateMethod { }
@end
@implementation MyClass
- (void)myPublicMethod {
[self myPrivateMethod];
}
@end