Для этого нет API, но код для этого достаточно прост:
void AddObjectToArray(NSMutableArray *array, id obj, NSUInteger maxCount) {
if ([array count] < maxCount)
[array addObject: obj];
}
Обратите внимание, что приведенный выше код не является потокобезопасным, но сделать его потокобезопасным примерно так же просто, как заключить содержимое функции в директиву @synchronized (array)
.
Если вам нужен массив, который может быть объединен и имеет встроенный предел, не не наследует кластер класса NSMutableArray
. Контракт NSMutableArray
(«соглашение», которое он имеет с вызывающим кодом) говорит, что вызов -addObject:
добавит этот объект в массив, а не если он будет ограничен.
Скорее, массив с максимальной длиной ведет себя достаточно иначе, чем стандартное поведение, поэтому он не должен быть подклассом NSMutableArray
. Это может показаться ухищрением - это массив, и вы можете изменить его, поэтому его следует рассматривать как NSMutableArray
. Но вызывающий код не может знать, что его модификации будут молча терпеть неудачу в вашем подклассе и, вероятно, не будут разработаны с учетом таких сбоев.
Если вызывающий код принадлежит вам, вы можете использовать вспомогательную функцию, определенную выше - вы знаете, что объекты могут быть не добавлены, и вы можете кодировать соответствующим образом. Если вызывающий код поступает из другого места (например, Какао или другие платформы Apple), используйте обычный NSMutableArray
и отбрасывайте его, когда вызывающий код завершает добавление объектов.