как добавить ноль к nsmutablearray?

NSArray *array = [[NSArray alloc] initWithObjects:@"ΕΛΤΑ",
                      @"ΕΛΤΑ COURIER", @"ACS", @"ACS ΕΞΩΤΕΡΙΚΟ", 
                      @"DHL", @"INTERATTICA", @"SPEEDEX", 
                      @"UPS", @"ΓΕΝΙΚΗ ΤΑΧΥΔΡΟΜΙΚΗ", @"ΜΕΤΑΦΟΡΙΚΕΣ ΕΞΩΤΕΡΙΚΟΥ", nil];

Это работает, потому что это имеет ноль в конце.

Но я добавляю объекты как это: addObject:name и т.д... Таким образом в конце я должен добавить ноль, я делаю этот addObhect:nil, но когда я запускаю приложение, это все еще отказывает в cellForRowAtIndexPath:

как я могу сделать эту работу?

Хорошо, я не должен добавлять ноль

Какова причина что мои сбои приложения затем?

51
задан Adrian Kosmaczewski 2 February 2011 в 10:29
поделиться

7 ответов

Вы не можете добавить ноль, когда вызываете addObject.

19
ответ дан 7 November 2019 в 09:38
поделиться

Вы не можете добавить объект на Nsarray , потому что этот класс неизменен. Вы должны использовать nsmutablearray Если вы хотите изменить массив после его создания.

0
ответ дан 7 November 2019 в 09:38
поделиться

Вам не нужно вызывать [addObject:nil]

В nil в initWithObjects: есть только для того, чтобы сказать методу, где заканчивается список, из-за того, как работает C varargs. Когда вы добавляете объекты один за другим с помощью addObject:, вам не нужно добавлять ноль.

26
ответ дан 7 November 2019 в 09:38
поделиться

Если необходимо добавить объект 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 .

15
ответ дан 7 November 2019 в 09:38
поделиться

nil используется для завершения массива

.
6
ответ дан 7 November 2019 в 09:38
поделиться

NIL не является объектом, который вы можете добавить в массив: массив не может содержать Nil . Вот почему AddObject: Nil сбои.

5
ответ дан 7 November 2019 в 09:38
поделиться

Это может быть немного похожим на бензопилу, чтобы косить газон, но вот выдержка из алгоритмов в двух словах

Создание дерева 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]];
231
ответ дан 7 November 2019 в 09:38
поделиться
Другие вопросы по тегам:

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