Можно ли объявить метод как частный в Objective-C? - PullRequest
20 голосов
/ 15 марта 2009

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

Ответы [ 6 ]

34 голосов
/ 16 марта 2009

Если вы работаете в 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 блоке находится реализация метода, и компилятор выдаст предупреждение, если метод расширения не реализован в классе '@implementation.

Как уже отмечали другие, среда выполнения Objective C не обеспечит конфиденциальность ваших методов (и не так уж сложно определить, какие методы используют дамп класса, даже без исходного кода), но компилятор генерировать предупреждение, если кто-то пытается позвонить им. В общем, сообщество ObjC принимает «Я сказал вам не вызывать этот метод [помещая его в расширение или категорию частного класса или , просто документально подтверждая, что метод является закрытым ], и вы все равно вызвали его. Что бы ни случилось, это твоя вина. Не будь глупым. " отношение к этому вопросу.

2 голосов
/ 15 марта 2009

Нет ничего, что помешает вызову метода (так как target-c основан на сообщениях, все может быть отправлено любое сообщение), но вы можете объявить их вне заголовка, чтобы они не были видны, и компилятор будет генерировать предупреждения б.

Это работает для методов класса и экземпляра.

* 1005 Е.Г. *

#import "SomeClass.h"

// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod; 
@end

Примечание: НЕ объявляйте переменные, подобные этой, иначе они станут переменными класса - например, только одна переменная будет использоваться всеми экземплярами.

2 голосов
/ 15 марта 2009

Нет, любой объект может отправить любое сообщение любому другому объекту. Однако вы можете поместить метод в категорию, которая является частью файла реализации класса. Таким образом, вы получите предупреждение «Класс может не реализовывать этот метод», если вы попытаетесь вызвать его где-нибудь еще. Это нормальный способ сделать метод "приватным".

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

Для реализации скрытых методов (экземпляра и / или класса)

    // ===========================
    // = 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

Ссылка на эту ссылку будет полезна.

0 голосов
/ 16 марта 2009

Как уже упоминалось, у вас не может быть кода, который

  1. метод и
  2. невозможно позвонить извне классом.

Люди уже отметили, что вы можете отказаться от пункта 2 и получить метод, который трудно, но не невозможно вызвать. В качестве альтернативы, почему бы не отказаться от пункта 1?

static id myPrivateMethod(MyObject *me, int arg1, id arg2) { ... }

Теперь код можно вызывать только из одного файла. Вы не получаете никакого волшебного личного доступа, который вы можете получить с помощью метода, так что это ни в коем случае не идеальное решение. Но лучшего способа добиться приватности нет.

0 голосов
/ 15 марта 2009

Вы можете сделать это, используя категории. У меня есть более полное описание в моем ответе на этот ТАК вопрос.

Как уже было сказано, никто не может остановить отправку сообщения селектору, но с помощью категорий вы можете уменьшить видимость этих функций.

Кроме того, у вас может быть несколько категорий, расширяющих класс. Таким образом, используя информативные имена категорий, вы можете сгруппировать частные функции в связанные блоки, улучшая самодокументированную природу вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...