Вращение памяти может быть проблемой здесь, начиная с каждой упаковки интервала, больше, чем, или равняться 128 причинам объектному выделению (см. Integer.valueOf (интервал)). Хотя сборщик "мусора" очень эффективно имеет дело с недолгими объектами, производительность пострадает до некоторой степени.
, Если Вы знаете, что количество инкрементов составило завещание в основном, превосходят численностью количество ключей (=words в этом случае), рассматривают использование международного держателя вместо этого. Phax уже представил код для этого. Здесь это снова с двумя изменениями (класс держателя, сделанный набором статического и начального значения к 1):
static class MutableInt {
int value = 1;
void inc() { ++value; }
int get() { return value; }
}
...
Map map = new HashMap();
MutableInt value = map.get(key);
if (value == null) {
value = new MutableInt();
map.put(key, value);
} else {
value.inc();
}
при необходимости в экстремальной производительности ищите Реализацию Map, которая непосредственно адаптируется к примитивным типам значения. jrudolph упомянул Находка GNU .
Между прочим, хороший критерий поиска для этого предмета является "гистограммой".
Однако, поскольку он доступен только для чтения, и я не нашел другого способа установить это свойство, мой вопрос: как мне установить его?
Если это только для чтения
, вы не можете использовать точечную нотацию, не получив ошибки компилятора .
Однако вы можете использовать категории , чтобы добавить пользовательский modifyParentViewController
в класс UIViewController
.
Даже если свойство доступно только для чтения, сама переменная может быть изменена, если она не @protected
. Если это @protected
, создание подкласса контроллера представления может позволить вам изменить переменную.
parentViewController предназначен для целей NavigationViewControllers и представления контроллеров модального представления. Невозможно установить свойство без методов pushViewController или presentModalViewController.
Я попробовал предложение Алекса купить, сделав категорию для UIViewController, и он работал в симуляторе, но не на моем телефоне. вот категория
@interface UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent;
@end
@implementation UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent
{
_parentViewController = parent;
}
@end
Он компилируется и работает хорошо, но обратите внимание на подчеркивание член, который немного не откладывает. Вот что вызывает ошибку компоновщика при компиляции с 3.0 SDK.
У меня есть вид контейнера, который имеет 2 витрины, а таблица - одна из них. Таблице нужен родитель, чтобы она могла, помимо всего прочего, взаимодействовать с навигационной панелью.
Вместо этого я предлагаю следующее решение:
@interface AdoptedTableViewController : UITableViewController {
UIViewController* surrogateParent;
}
-(UINavigationController*)navigationController;
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent;
@end
@implementation AdoptedTableViewController
@synthesize surrogateParent;
-(UINavigationController*)navigationController
{
if( [super navigationController] )//self.navigationController )
{
return [super navigationController];
}
else
{
return surrogateParent.navigationController;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Все мои контроллеры представления таблиц теперь являются контроллерами TableViewControllers. Основная причина, по которой им нужны родители, заключается в том, что они могут подталкивать контроллеры просмотра к навигационному стеку, так что это прозрачно обрабатывается получателем контроллера навигации.
Было бы неплохо, если бы parentViewController не только читался, но и в моей работе с _parentViewController я обнаружил, что в иерархии ViewController есть нечто большее, чем просто это свойство. Я думаю, что может быть много связи и обязанностей в этих отношениях, что Apple не очистила достаточно для масс. Например, я заметил странное поведение при отборе при перемещении вверх по иерархии навигации, которое я не смог исправить. Может быть, контроллеры UINavigation отражают класс своего верхнего контроллера и ведут себя по-другому?
Короче говоря, на самом деле они только для чтения, и нет никакого чистого или простого обходного пути. Нужно просто обдумать это.
Похоже, вызов метода setParentViewController: работает.
[childViewController setParentViewController:self];
Однако это все равно генерирует предупреждение компилятора. Что, IMO, означает, что не делайте этого (вместо этого я выделил подклассы).
Решение:
- (void)setParentController:(UIViewController*)parent{
[self setValue:parent forKey:@"_parentViewController"];
}
Не вызывает проблем с компоновщиком!
PS: Не используйте "setParentViewController" в качестве имени метода, потому что этот метод существует в частном API, и Apple сообщает: "В ваше приложение включен закрытый API-интерфейс setParentViewController :.
Если вы определили метод в исходном коде с тем же именем, что и упомянутый выше API, мы предлагаем изменить имя вашего метода, чтобы оно больше не конфликтовало с частным API Apple, чтобы ваше приложение не было помечено при отправке в будущем.
Пожалуйста, решите эту проблему в следующем обновлении ... "