Из документации в NSArray
:
NSArray «соединен бесплатно» со своим базовым аналогом, ссылкой CFArray.Это означает, что тип Core Foundation взаимозаменяем в вызовах функций или методов с мостовым объектом Foundation, предоставляя вам возможность приводить один тип к другому.Следовательно, в API, где вы видите параметр NSArray *, вы можете передать CFArrayRef, а в API, где вы видите параметр CFArrayRef, вы можете передать экземпляр NSArray.Это расположение также относится к вашим конкретным подклассам NSArray.
Таким образом, проблема должна быть с двумя вызываемыми методами.Опять же, из документации CGWindowListCopyWindowInfo
имеет возвращаемое значение:
Массив типов CFDictionaryRef, каждый из которых содержит информацию об одном из окон в текущем сеансе пользователя.Если нет окон, соответствующих требуемым критериям, функция возвращает пустой массив.Если вы вызываете эту функцию вне сеанса безопасности графического интерфейса или когда не работает ни один оконный сервер, эта функция возвращает NULL.
и CGWindowListCreate
имеет возвращаемое значение:
Массив значений CGWindowID, соответствующих желаемым окнам.Если нет окон, соответствующих требуемым критериям, функция возвращает пустой массив.Если вы вызываете эту функцию вне сеанса безопасности графического интерфейса или когда не работает ни один оконный сервер, эта функция возвращает NULL.
Когда вы вызываете NSLog(@"%@",array);
, сообщение description
отправляется каждомуОбъект в массиве.Float, BOOLs и int не отвечают на это сообщение.Например, вы получите ошибку для
NSLog(@"Printing 2: %@",2);
, но ошибка исчезнет, если вы используете вызов int
:
NSLog(@"Printing 2: %d",2);
В вашем случае CGWindowListCreate
возвращаетмассив значений CGWindowID
, и это 32-разрядные целые числа без знака.Поэтому они не отвечают на %@
, но будут отвечать на %u
.Следовательно, исправление состоит в том, чтобы печатать массив вручную, используя %u
.