Некоторый новичок вопросы о Objective-C/iPhone

Вы можете использовать LINQ для удаления символа из массива символов, если символ с данным индексом является числом.

КОД

//This will return you the list of char discarding the number.
var removedDigits = tocheckTextBox.Where(x => !char.IsDigit(x)); 

//This will return the string without numbers.
string output = string.join("", removedDigits); 
7
задан Karolis 2 April 2009 в 16:45
поделиться

5 ответов

  1. В Objective C возможно возвратить экземпляр кроме сам от -init. Классы делают это, например, для осуществления одноэлементного экземпляра, или в случае кластеров класса. NSNumber, например, возвращается, подкласс в зависимости от типа значения передал своему инициализатору. Таким образом, когда Вы звоните [[NSNumber alloc] initWithLong:long_value], NSNumber -initWithLong: инициализатор называют после NSNumber +alloc, но подкласс NSNumber может быть возвращен oringial вызывающей стороне. Таким образом шаблон

    сам = [супер init];

    который повторно присваивается self к значению [super init] так, чтобы self точки к фактическому экземпляру это [super init] возвращенный. Если +alloc или super's init сбои метода, результат [super init] может быть nil. Для предотвращения, побочные эффекты в случае неудавшейся инициализации, шаблон затем становится

    - (id) init {
      if(self = [super init]) {
        // do initialization of instance variables etc.
      }
    
      return self;
    }
    

    Обратите внимание, что необходимо возвратиться self (или nil или другой экземпляр) от init метод. Необходимо присвоиться сам к [super init] и можно проверить на nil прежде, чем сделать больше работы.

  2. Вам, вероятно, придется выпустить возвращаемое значение staic метода. Необходимо прочитать руководство по управлению памятью Какао. Правило обычно довольно просто: Если метод, который Вы называете, имеет "новый", "выделение" или "копия" в ее подписи, результат принадлежит вызывающей стороне, и вызывающая сторона должна звонить -release на том экземпляре или будет утечка памяти. Конечно, необходимо звонить -retain на чем-либо еще (т.е. не от "выделения", "нового" или метод "копии"), Вы хотите сохранить ссылку на и затем звонить -release или -autorelease когда Вы сделаны с тем экземпляром.

  3. str = @"Hi there!", принятие str был объявлен как NSString *str; присваивает адрес строковой константы @"Hi there!" to the value of theул.variable. You do not need to retain or release string constants.ул. = [[выделение NSString] initWithString:@ "Привет там!"];allocates a new string instance. The value ofул.will be the address of this instance. Each call ofул. = [[выделение NSString] initWithString:@ "Привет там!"];again will allocate a new instance. So afterstr2 = [[выделение NSString] initWithString:@ "Привет там!"];,ул.! = str2, while afterstr2 = "Привет Вот!", str==str2. См. этот ответ также.

  4. -autorelease добавляет получатель к току NSAutoreleasPool. Когда пул истощен (обычно в конце текущего повторения цикла выполнения, или когда пул вручную истощен), вызовы пула -release на всех экземплярах в пуле. Если это -release отбрасывания сохранить количество к 0, объект освобожден (и -dealloc названный) так же, как с любым другим -release. Используя автовыпуск пул обычно осуждается на iPhone, потому что он может заставить Вас накапливать много неиспользованных экземпляров в пуле, прежде чем он будет истощен в конце повторения цикла выполнения. Если можно использовать -release вместо -autorelease, Вы обычно должны. Снова, см. руководство по управлению памятью Какао для большего количества информации.

11
ответ дан 6 December 2019 в 12:54
поделиться
  1. Существует философская школа что в большинстве случаев, выделяя self указатель - что-то, что система должна сделать, а не программист.

Кроме того, многие люди предпочитают сохранять основную строку процесса выполнения программы максимально нес отступом. В этом случае код инициализации мог быть переписан как:

- (id)init {
    if (![super init]) {
        return nil; // There is a problem so bail early.
    }
    // Initialisation code here.
    return self
}

Будет Шипли объяснять это намного лучше, чем я.

2
ответ дан 6 December 2019 в 12:54
поделиться

1: Эта проверка должна гарантировать, что супер конструктор возвратил новый объект.

2: Статические методы не относятся к экземпляру

3:

str = @"Hi there!"

Это присваивает адрес постоянной строки "Привет там!" к ул. указателя

str = [[NSString alloc] initWithString:@"Hi there!"];

Это выделяет строку и копирует "Привет Вот!" к нему. Это означает что a) ул. является модифицируемой и b) потребности, которые будут освобождены, когда Вы сделаны с ним.

1
ответ дан 6 December 2019 в 12:54
поделиться
  1. Если сам ноль после супер инициализации затем, Вы, вероятно, вне памяти. Ваш единственный разумный план действий должен возвратить ноль, и вещи надежды обрабатываются корректно далее стек.

  2. Статические методы не позволяются, выделяют на "куче", поэтому нет ничего к свободному.

  3. Прежде всего строка компилируется в сегмент данных Вашего приложения и не может быть освобождена. Во втором экземпляре Вы выделяете память от "кучи" и копируете Вашу статическую строку (с сегмента данных) в него.

  4. Это - простая сборка "мусора". Относительно того, почему использовать его, простой ответ, не делают. Не рекомендуется использовать автовыпуск на iPhone из-за ограниченных ресурсов.

1
ответ дан 6 December 2019 в 12:54
поделиться

вызов

self = [super init];

Может возвратить ноль, если суперкласс не может инициализировать себя по какой-либо причине, включая память, являющуюся недоступными, или определенными предпосылками, не были встречены. Если это так, Вы не хотите пытаться установить переменные сам, или установить сам как делегат или добавить сам к массиву, если сам ноль.

Пул автовыпуска является чем-то созданным на каждое событие, iPhone посылает Ваше заявление. Это создано перед любыми выполнениями кода и выпущено после того, как весь Ваш код сделан для каждого события. Любые объекты, которые Вы называете autorelease на будет помещен в текущий пул автовыпуска. Любые объекты в пуле автовыпуска будут выпускаться так много раз, как они были добавлены, после того, как Ваш код завершается. Таким образом Вы не должны волноваться о том, кто ответственен за выпуск объекта, созданного одним методом, и возвратился к другому методу.

Можно создать собственные объединения автовыпуска по мере необходимости.

str = [[NSString alloc] initWithString:@"Hi there!"];

Эта строка создает строку, которая не находится в пуле автовыпуска, таким образом, необходимо выпустить ее вручную. Просто запись

@"Hi there!";

возвращает строку, которую Вы не должны волновать по поводу выпуска. Расширение предыдущего примера:

str = [[[NSString alloc] initWithString:@"Hi there!"] autorelease];

был бы другой метод создания строки, которую Вы не должны волновать по поводу выпуска.

Одно различие между пулами сборки "мусора" и автовыпуска - то, что сборка "мусора" работает с циклическими ссылками. Используя пулы автовыпуска, Вы не хотите иметь два объекта, которые сохраняют друг друга и надеются, что, после того как ничто иное не относится к ним, они выйдут из существования; они не будут.

1
ответ дан 6 December 2019 в 12:54
поделиться