Z documentation na NSArray
:
NSArray jest „bezpłatnego zmostkowany "Z odpowiednikiem Core Foundation, Reference CFArray. Oznacza to, że typ rdzenia rdzenia jest wymienny w wywołaniach funkcji lub metod za pomocą zmostkowanego obiektu fundacji , umożliwiając rzutowanie jednego typu na drugi. W związku z tym w interfejsie API, w którym jest wyświetlany parametr NSArray *, można przekazać wartość CFArrayRef w postaci , aw interfejsie API, w którym jest wyświetlany parametr CFArrayRef , można przekazać instancję NSArray. Ten układ również dotyczy twoich konkretnych podklas NSArray.
Problem musi być związany z wywoływaniem dwóch metod. Ponownie, z dokumentacji, CGWindowListCopyWindowInfo
ma wartość powrotu:
Tablica typów CFDictionaryRef, z których każda zawiera informacje o jedno z okien w bieżącej sesji użytkownika. Jeśli nie ma okien spełniających wymagane kryteria, funkcja zwraca pustą tablicę . Jeśli wywołasz tę funkcję poza sesją zabezpieczeń GUI lub gdy nie jest uruchomiony żaden serwer okien, ta funkcja zwraca NULL.
i CGWindowListCreate
ma wartość powrotną:
Tablica wartości CGWindowID odpowiadający mu okna. Jeśli nie ma okien pasujących do żądanych kryteriów, funkcja zwraca pustą tablicę. Jeśli wywołasz tę funkcję spoza sesji zabezpieczeń GUI lub gdy nie jest uruchomiony żaden serwer okien, ta funkcja zwraca wartość NULL.
Po wywołaniu NSLog(@"%@",array);
, wiadomość description
jest wysyłana do każdego obiektu w tablicy. Floats, BOOLs i int nie odpowiadają na tę wiadomość. Na przykład, otrzymasz błąd na
NSLog(@"Printing 2: %@",2);
ale błąd nie zniknie, jeśli używasz int
połączenia:
NSLog(@"Printing 2: %d",2);
Twoim przypadku, CGWindowListCreate
zwraca tablicę CGWindowID
wartości, a te są 32-bitowymi liczbami całkowitymi bez znaku. Dlatego nie odpowiadają na %@
, ale odpowiedzą na %u
. Stąd poprawka polega na ręcznym drukowaniu tablicy przy użyciu %u
.
Ah! Teraz ma to sens, dlaczego zachowywał się w połowie jak tablica C, a na pół jak obiekt. Dziękuję za odpowiedź. –