Как сделать один метод в классе для частного в Objective-C? - PullRequest
0 голосов
/ 03 марта 2010

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

Ответы [ 4 ]

3 голосов
/ 03 марта 2010

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

Обычно это так:

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

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

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

1 голос
/ 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, это не помешает вызову этих методов другими классами. Они получат предупреждение о том, что класс может не отвечать на сообщение, но во время выполнения это сработает. Единственное, что это дает, - это возможность скрывать методы от других программистов.

1 голос
/ 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
0 голосов
/ 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
...