Можно ли объявить метод как закрытый в Objective-C?
Можно ли объявить метод как закрытый в Objective-C?
Ответ 1
Если вы работаете в Objective-C 2.0, лучший способ создать методы, которые "трудно" для других, чтобы позвонить, - это поместить их в расширение класса. Предполагая, что у вас есть
@interface MyClass : NSObject {
}
- (id)aPublicMethod;
@end
в файле MyClass.h
, вы можете добавить к своему MyClass.m
следующее:
@interface MyClass () //note the empty category name
- (id)aPrivateMethod;
@end
@implementation MyClass
- (id)aPublicMethod {...}
- (id)aPrivateMethod {...} //extension method implemented in class implementation block
@end
Преимущество расширения класса заключается в том, что методы "расширения" реализованы в исходном классе класса. Таким образом, вам не нужно беспокоиться о том, что @implementation
блокирует реализацию метода, и компилятор выдаст предупреждение, если метод расширения не реализован в классе <<24 > .
Как отмечали другие, среда выполнения Objective-C не будет обеспечивать неприкосновенность ваших методов (и ее не слишком сложно выяснить, что эти методы используют дамп класса, даже без исходного кода), но компилятор будет генерируйте предупреждение, если кто-то попытается их вызвать. В общем, сообщество ObjC принимает "Я сказал вам не вызывать этот метод [путем помещения его в расширение или категорию частного класса или просто путем документирования того, что этот метод является приватным], и вы его вызывали в любом случае. Не будь глупым. отношение к этому вопросу.
Ответ 2
Нет, любой объект может отправлять любое сообщение любому другому объекту. Однако вы можете поместить метод в категорию, которая является частью файла реализации класса. Таким образом, вы получите предупреждение "Класс не может реализовать этот метод", если вы попытаетесь вызвать его в другом месте. Это обычный способ сделать метод "приватным".
Ответ 3
Нет ничего, что помешает вызываемому методу (поскольку objective-c - это сообщение на основе чего-либо, может быть отправлено любое сообщение), но вы можете объявить их за пределами заголовка, чтобы они не были видны, и компилятор генерирует предупреждения, если б.
Это работает как для методов класса, так и для экземпляра.
например.
#import "SomeClass.h"
// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod;
@end
Примечание. НЕ объявляйте такие переменные или они станут переменными класса - например. только одна переменная будет использоваться всеми экземплярами.
Ответ 4
Вы можете сделать это, используя категории. У меня есть более полное описание в ответе на этот вопрос SO.
Как уже было сказано, вы не можете запретить кому-либо отправлять сообщение селектору, но с помощью категорий вы можете уменьшить видимость этих функций.
Кроме того, вы можете иметь более одной категории, расширяющей класс. Таким образом, с помощью имен информационных категорий вы можете группировать частные функции в соответствующие блоки, улучшая самодокументируемую природу вашего кода.
Ответ 5
Как уже упоминалось, у вас не может быть кода
- метод и
- невозможно вызвать извне класса.
Люди уже указали, что вы можете отказаться от пункта 2 и получить метод, который трудно, но не невозможно вызвать. В качестве альтернативы, почему бы не оставить точку 1?
static id myPrivateMethod(MyObject *me, int arg1, id arg2) { ... }
Теперь код может быть вызван только из одного файла. Вы не получаете какой-либо магический доступ к частному члену, который вы можете получить с помощью метода, поэтому это далеко не идеальное решение. Но нет лучшего способа добиться конфиденциальности.
Ответ 6
Чтобы реализовать скрытые методы (экземпляр и/или класс)
// ===========================
// = File: SomeClass.m
// ===========================
#import "SomeClass.h"
// =================================
// = Interface for hidden methods
// =================================
@interface SomeClass (hidden)
-(void) hiddenInstanceMethod;
@end
// ================================
// = Implementation for SomeClass
// ================================
@implementation SomeClass
-(void) hiddenInstanceMethod
{
printf( "Hidden instance method\n" );
}
-(void) msg
{
printf("Inside msg()...\n");
[self hiddenInstanceMethod];//private method calling
}
@end
http://macdevelopertips.com/objective-c/private-methods.html
reffer эта ссылка будет полезна.