NSArray *array = [[NSArray alloc] initWithObjects:@"ΕΛΤΑ",
@"ΕΛΤΑ COURIER", @"ACS", @"ACS ΕΞΩΤΕΡΙΚΟ",
@"DHL", @"INTERATTICA", @"SPEEDEX",
@"UPS", @"ΓΕΝΙΚΗ ΤΑΧΥΔΡΟΜΙΚΗ", @"ΜΕΤΑΦΟΡΙΚΕΣ ΕΞΩΤΕΡΙΚΟΥ", nil];
Это работает, потому что это имеет ноль в конце.
Но я добавляю объекты как это: addObject:name
и т.д... Таким образом в конце я должен добавить ноль, я делаю этот addObhect:nil, но когда я запускаю приложение, это все еще отказывает в cellForRowAtIndexPath:
как я могу сделать эту работу?
Хорошо, я не должен добавлять ноль
Какова причина что мои сбои приложения затем?
Вы не можете добавить ноль, когда вызываете addObject
.
Вы не можете добавить объект на Nsarray
, потому что этот класс неизменен. Вы должны использовать nsmutablearray
Если вы хотите изменить массив после его создания.
Вам не нужно вызывать [addObject:nil]
В nil
в initWithObjects:
есть только для того, чтобы сказать методу, где заканчивается список, из-за того, как работает C varargs
. Когда вы добавляете объекты один за другим с помощью addObject:
, вам не нужно добавлять ноль.
Если необходимо добавить объект nil
в коллекцию, используйте класс NSNull
:
Класс NSNull определяет объект singleton, используемый для представления нулевых значений в объектах коллекции (которые не разрешают значения nil).
Предполагается, что «array» имеет тип NSMuterArray:
....
[array addObject:[NSNumber numberWithInt:2];
[array addObject:@"string"];
[array addObject:[NSNull null]];
-121--1033494- Оказывается, что нет способа надежного восстановления семафора. Конечно, любой может post _ sem ()
к именованному семафору, чтобы снова увеличить число после нуля, но как определить, когда необходимо такое восстановление? Предоставленный API слишком ограничен и никоим образом не указывает, когда это произошло.
Остерегайтесь доступных инструментов ipc - общие инструменты ipcmk
, ipcrm
и ipcs
предназначены только для устаревших семафоров SysV. Они специально не работают с новыми семафорами POSIX.
Но, похоже, есть другие вещи, которые можно использовать для блокировки вещей, которые операционная система автоматически выпускает, когда приложение умирает в путь, который не может быть зафиксирован в обработчике сигналов. Два примера: прослушивающий сокет, привязанный к определенному порту, или блокировка определенного файла.
Я решил, что блокировка файла - это решение, которое мне нужно. Поэтому вместо вызова sem _ wait ()
и sem _ post ()
я использую:
lockf( fd, F_LOCK, 0 )
и
lockf( fd, F_ULOCK, 0 )
При выходе приложения в любой путь файл автоматически закрывается, что также снимает блокировку файла. Другие клиентские приложения, ожидающие «семафора», могут работать так, как ожидалось.
Спасибо за помощь, ребята.
-121--1105357-Если в коллекции действительно требуется предмет Null-ish, для этого существует NSNull .
NIL
не является объектом, который вы можете добавить в массив: массив не может содержать Nil
. Вот почему AddObject: Nil
сбои.
Это может быть немного похожим на бензопилу, чтобы косить газон, но вот выдержка из алгоритмов в двух словах
Создание дерева KD ...
public class KDFactory {
// Known comparators for partitioning points along dimensional axes.
private static Comparator<IMultiPoint> comparators[ ] ;
// Recursively construct KDTree using median method on input points.
public static KDTree generate (IMultiPoint [ ] points) {
if (points. length == 0) { return null; }
// median will be the root.
int maxD = points[ 0] . dimensionality( );
KDTree tree = new KDTree(maxD) ;
// Make dimensional comparators that compare points by ith dimension
comparators = new Comparator[ maxD+1] ;
for (int i = 1; i <= maxD; i++) {
comparators[ i] = new DimensionalComparator(i) ;
}
tree. setRoot(generate (1, maxD, points, 0, points. length-1) ) ;
return tree;
}
// generate the node for the d-th dimension (1 <= d <= maxD)
// for points[ left, right]
private static DimensionalNode generate (int d, int maxD,
IMultiPoint points[ ] ,
int left, int right) {
// Handle the easy cases first
if (right < left) { return null; }
if (right == left) { return new DimensionalNode (d, points[ left] ) ; }
// Order the array[ left, right] so the mth element will be the median
// and the elements prior to it will all be <=, though they won' t
// necessarily be sorted; similarly, the elements after will all be >=
int m = 1+(right-left) /2;
Selection. select(points, m, left, right, comparators[ d] ) ;
// Median point on this dimension becomes the parent
DimensionalNode dm = new DimensionalNode (d, points[ left+m-1] ) ;
// update to the next dimension, or reset back to 1
if (++d > maxD) { d = 1; }
// recursively compute left and right sub-trees, which translate
// into ' below' and ' above' for n-dimensions.
dm. setBelow(maxD, generate (d, maxD, points, left, left+m-2) ) ;
dm. setAbove(maxD, generate (d, maxD, points, left+m, right) ) ;
return dm;
}
}
Найти ближайших соседей лучше всего: O (log n) худший O (N)
// method in KDTree
public IMultiPoint nearest (IMultiPoint target) {
if (root == null) return null;
// find parent node to which target would have been inserted. This is our
// best shot at locating closest point; compute best distance guess so far
DimensionalNode parent = parent(target) ;
IMultiPoint result = parent. point;
double smallest = target. distance(result) ;
// now start back at the root, and check all rectangles that potentially
// overlap this smallest distance. If better one is found, return it.
double best[ ] = new double[ ] { smallest };
double raw[ ] = target. raw( );
IMultiPoint betterOne = root. nearest (raw, best) ;
if (betterOne ! = null) { return betterOne; }
return result;
}
// method in DimensionalNode. min[ 0] contains best computed shortest distance.
IMultiPoint nearest (double[ ] rawTarget, double min[ ] ) {
// Update minimum if we are closer.
IMultiPoint result = null;
// If shorter, update minimum
double d = shorter(rawTarget, min[ 0] ) ;
if (d >= 0 && d < min[ 0] ) {
min[ 0] = d;
result = point;
}
// determine if we must dive into the subtrees by computing direct
// perpendicular distance to the axis along which node separates
// the plane. If d is smaller than the current smallest distance,
// we could "bleed" over the plane so we must check both.
double dp = Math. abs(coord - rawTarget[ dimension-1] ) ;
IMultiPoint newResult = null;
if (dp < min[ 0] ) {
// must dive into both. Return closest one.
if (above ! = null) {
newResult = above. nearest (rawTarget, min) ;
if (newResult ! = null) { result = newResult; }
}
if (below ! = null) {
newResult = below. nearest(rawTarget, min) ;
if (newResult ! = null) { result = newResult; }
}
} else {
// only need to go in one! Determine which one now.
if (rawTarget[ dimension-1] < coord) {
if (below ! = null) {
newResult = below. nearest (rawTarget, min) ;
}
} else {
if (above ! = null) {
newResult = above. nearest (rawTarget, min) ;
}
}
// Use smaller result, if found.
if (newResult ! = null) { return newResult; }
}
return result;
}
Подробнее на KD-деревья в Википедии
-121--1574686- Если вы должны добавить объект NIL
в коллекцию, используйте класс Nsnull
:
Класс NSNull определяет объект Singleton, используемый для представления нулевых значений в коллекции объекты (которые не позволяют значения NIL).
Предполагая «массив» имеет тип NsmutablearRay:
....
[array addObject:[NSNumber numberWithInt:2];
[array addObject:@"string"];
[array addObject:[NSNull null]];