Подтвердить что ты не робот

Можно ли объявить метод как закрытый в Objective-C?

Можно ли объявить метод как закрытый в Objective-C?

4b9b3361

Ответ 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 эта ссылка будет полезна.