как сделать единственный метод в классе приватным в Objective-c?

как сделать единственный метод в классе приватным в Objective-c?


person suse    schedule 03.03.2010    source источник
comment
Вы захотите прочитать этот stackoverflow.com/questions/2158660/   -  person bbum    schedule 03.03.2010


Ответы (4)


В Objective-C нет концепции частных методов. Однако вы можете запретить использование метода в файле заголовка и добавить категорию в частный файл.

Обычно это выглядит так:

@interface MyObject : NSObject {
   // ivars
}
// public methods
@end

// usually in a seperate file
@interface MyObject ()
// private methods
@end

Пустое имя категории означает, что это class extension, это сообщает компилятору, что метод требуется в основном блоке реализации.

person Georg Schölly    schedule 03.03.2010

Строго говоря, в 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
person Williham Totland    schedule 03.03.2010

Objective-C изначально не поддерживает частные методы.

Однако вы можете добиться управления частным методом, используя «расширения классов» (анонимные категории).

Основная идея состоит в том, чтобы объявить расширение класса с вашими частными методами внутри файла реализации для вашего класса (а не его заголовка), но за пределами вашего блока @implementation. Затем вы можете реализовать методы, и никакой внешний класс не сможет их увидеть. Нравится:

@interface MyClass ()
    - (void)myPrivateMethod;
@end

@implementation MyClass
    - (void)myPrivateMethod
    {
        //implementation goes here
    }

    -(void)someOtherMethod
    {
        [self myPrivateMethod];
    }
@end

Использование расширения класса вынуждает вас реализовать методы в основном блоке @implementation и требует, чтобы они были реализованы (как если бы они были объявлены в основном блоке @interface в заголовке).

К сожалению, из-за динамической природы Objective-C это фактически не предотвратит вызов этих методов другими классами. Они получат предупреждение о том, что класс может не отвечать на сообщение, но во время выполнения он будет работать. Единственное, что это дает вам, - это возможность скрыть методы от других программистов.

person Jasarien    schedule 03.03.2010
comment
Анонимные категории называются расширением класса. Разница в том, что метод должен быть объявлен в основном блоке реализации. Нормальные категории могут находиться в отдельном блоке, в основном блоке реализации или даже не находиться вовсе. - person Georg Schölly; 03.03.2010

Вы не можете. Только переменные экземпляра могут быть помечены как частные.

Хотя есть способы сделать что-то эквивалентное частным методам. Общая идея заключается в том, что вы объявляете закрытый метод не в заголовке, а в файле реализации.

Следовательно, если вы хотите иметь общедоступный (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
person Adrian    schedule 03.03.2010
comment
Было бы неплохо получить преимущества / недостатки для каждого метода. - person Georg Schölly; 03.03.2010