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

Это должно работать:

private ArrayList<Item> mItems;

public void replaceItem(final Item newItem, final int position) {
    mItems.set(position, newItem);
    notifyItemChanged(position);
}  

ArrayList.set() - это способ заменить элементы.

Для добавления элементов просто добавьте их в mItems, а затем перейдите notifyDatasetChanged(). Другой способ - использовать notifyItemRangeInserted(). В зависимости от того, где / как вы добавляете новые элементы и сколько их, это может стоить того.

20
задан Matt J 15 March 2009 в 02:04
поделиться

5 ответов

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

2
ответ дан 30 November 2019 в 00:01
поделиться

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

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

, Например,

#import "SomeClass.h"

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

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

2
ответ дан 30 November 2019 в 00:01
поделиться

Если Вы работаете в Objective C 2.0, лучший способ создать методы, которые "трудны" для других звонить, должен поместить их в расширение класса. Принятие Вас имеет

@interface MyClass : NSObject {

}

- (id)aPublicMethod;

@end

в a 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

advanage расширения класса - то, что "дополнительные" методы реализованы в исходном теле класса. Таким образом Вы не должны волноваться о который @implementation заблокируйтесь реализация метода находится в, и компилятор даст предупреждение, если дополнительный метод не будет реализован в классе @implementation.

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

34
ответ дан 30 November 2019 в 00:01
поделиться

Можно сделать так при помощи категорий. У меня есть более полное описание в моем ответе на это ТАК вопрос.

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

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

0
ответ дан 30 November 2019 в 00:01
поделиться

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

  1. метод, и
  2. невозможный звонить снаружи класса.

Люди уже указали, что можно отказаться от точки 2, и получать метод, который это - hard-but-not-impossible для вызова. С другой стороны, почему бы не отказаться от точки 1?

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

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

0
ответ дан 30 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: