Это должно работать:
private ArrayList<Item> mItems;
public void replaceItem(final Item newItem, final int position) {
mItems.set(position, newItem);
notifyItemChanged(position);
}
ArrayList.set()
- это способ заменить элементы.
Для добавления элементов просто добавьте их в mItems
, а затем перейдите notifyDatasetChanged()
. Другой способ - использовать notifyItemRangeInserted()
. В зависимости от того, где / как вы добавляете новые элементы и сколько их, это может стоить того.
Нет, любой объект может отправить любое сообщение в любой другой объект. Можно, однако, поместить метод в категорию, это - часть файла реализации класса. Тем путем Вы доберетесь, "Класс не может реализовать этот метод" предупреждение, при попытке назвать его где-нибудь еще. Это - нормальный способ сделать метод "частным".
Нет ничего, что предотвратит называемый метод (так как цель-c является сообщением, базирующимся, что-либо может быть отправлено любое сообщение), но можно объявить их за пределами заголовка, таким образом, они не видимы, и компилятор генерирует предупреждения, если используется.
Это работает и на методы класса и на методы экземпляра.
, Например,
#import "SomeClass.h"
// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod;
@end
Примечание: НЕ объявляйте переменные как это, или они станут переменными класса - например, только одна переменная будет использоваться всеми экземплярами.
Если Вы работаете в 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 берет, "Я сказал Вам не называть этот метод [путем помещения его в частное расширение класса или категорию или только путем документирования, что метод частный], и Вы назвали его так или иначе. Независимо от того, что путаница следует, Ваш отказ. Не будьте глупы". отношение к этой проблеме.
Можно сделать так при помощи категорий. У меня есть более полное описание в моем ответе на это ТАК вопрос.
, Как был сказан, Вы не можете остановить никого отправляющего сообщение в селектор, но при помощи категорий можно уменьшить видимость этих функций.
кроме того, у Вас может быть больше чем одна категория, расширяющая класс. Так, при помощи информативных названий категории можно сгруппировать закрытые функции в связанные блоки, улучшив природу самодокументирования кода.
Как другие упомянули, у Вас не может быть кода, который это
Люди уже указали, что можно отказаться от точки 2, и получать метод, который это - hard-but-not-impossible для вызова. С другой стороны, почему бы не отказаться от точки 1?
static id myPrivateMethod(MyObject *me, int arg1, id arg2) { ... }
Теперь код можно только назвать из того же файла. Вы не получаете ни одного волшебного доступа члена парламента, не занимающего официального поста, который можно получить с методом, таким образом, это ни в коем случае не идеальное решение. Но нет никакого лучшего способа достигнуть конфиденциальности.