我讀的iOS大書呆子牧場的書,其中一個例子說明了如何觀測添加到NSNotificaionCenter:NSNotification面向對象
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];
現在orientationChanged的方向是從張貼在NSNotification對象檢索:
- (void)orientationChanged:(NSNotification *)note {
NSLog(@"orientationChanged %d", [[note object] orientation]);
}
我的困惑是在這條線:[注對象]取向]
NSNotification的對象返回和id,所以這意味着我們不知道對象的類型是在編譯時UIDevice。但是,我們可以從返回的對象訪問方向,而不會在編譯器中出錯。編譯器如何知道對象類型是UIDevice,訪問方向是否可以接受?
你可以隨便什麼消息沒有發送到類型'id'的對象。它必須是編譯器以前見過的方法。否則,你會得到一個編譯器警告「選擇器XXX沒有已知的實例方法」。試試這個:'id foo = @「stuff」; [id qwerty];'。除非你碰巧有另一個具有'qwerty'方法的類,否則不會編譯。 – rmaddy 2013-03-20 16:09:40
@rmaddy它會編譯,你只會得到一個警告。警告!=錯誤。 – 2013-03-20 16:18:59
我說「編譯器警告」。請記住,在大多數情況下,警告很重要,很可能會導致運行時崩潰。當然有些情況下它會起作用。我想說,對於大多數開發者來說,如果你得到這樣的編譯器警告,它必須被修復或者應用程序會崩潰。 – rmaddy 2013-03-20 16:22:22