Как использовать параметрический метод с NSNotificationCenter?

  1. В больших приложениях обычно строковые литералы занимают большие биты памяти. Таким образом, чтобы эффективно обрабатывать память, JVM выделяет область, называемую «Пул константных строк». ( Обратите внимание, что в памяти даже строка, на которую нет ссылок, несет вокруг char [], int для своей длины и другую для своего хэш-кода. Для числа, напротив, требуется максимум восемь непосредственных байтов )
  2. Когда complier встречается с литералом String, он проверяет пул, чтобы увидеть, существует ли уже идентичный литерал. И если он найден, ссылка на новый литерал направляется на существующую строку, и новый объект-литерал String не создается (существующая строка просто получает дополнительную ссылку).
  3. Следовательно: Изменяемость строк сохраняет память ...
  4. Но когда любая из переменных меняет значение, на самом деле - меняется только их ссылка, а не значение в памяти (следовательно, оно не повлияет на другие переменные, ссылающиеся на него), как показано ниже ....

  5. String s1 = "Старая строка";

    //s1 variable, refers to string in memory
            reference                 |     MEMORY       |
            variables                 |                  |
    
               [s1]   --------------->|   "Old String"   |
    

    Строка s2 = s1;

    //s2 refers to same string as s1
                                      |                  |
               [s1]   --------------->|   "Old String"   |
               [s2]   ------------------------^
    

    s1 = "Новая строка";

    //s1 deletes reference to old string and points to the newly created one
               [s1]   -----|--------->|   "New String"   |
                           |          |                  |
                           |~~~~~~~~~X|   "Old String"   |
               [s2]   ------------------------^
    

    Исходная строка «в памяти» не изменилась, но переменная-ссылка была изменена таким образом, чтобы она ссылалась на новую строку. И если бы у нас не было s2, «Старая строка» все равно была бы в памяти, но у нас не было бы доступа к ней ...

7
задан stefanB 23 June 2009 в 21:23
поделиться

1 ответ

Вы получите объект NSNotification, а не NSDictionary в обратном вызове уведомления.

Попробуйте следующее:

- (void) processit: (NSNotification *)note {
    NSString *test = [[note userInfo] valueForKey:@"l"];
    NSLog(@"output is %@", test);
}
17
ответ дан 6 December 2019 в 10:02
поделиться