IOS開發筆記11-Object-C中的傳遞消息,在前一篇例子中傳遞的是一個無參的消息,接著繼續介紹傳遞實參的消息。
#importint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSDate *today=[NSDate date]; NSDate *later=[today dateByAddingTimeInterval:100000]; NSLog(@"%@",later); } return 0; }
以上程序中dateByAddingTimeInterval:方法接受新的NSDate實例和初始NSDate實例的差值。方法帶實參的時候,冒號是構成方法名的一個重要部分。
接下來看看帶多個實參的例子:
#importint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSDate *date=[NSDate date]; NSCalendar *calendar=[NSCalendar currentCalendar]; unsigned long day=[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; NSLog(@"%lu",day); } return 0; }
NSDate對象無法計算某個日期是相應月份中的第幾日,因此我們需要NSCalendar對象,發送一個currentCalendar消息給NSCalendar類來創建一個NSCalendar實例。NSCalendar有一個ordinalityOfUnit:inUnit:forDate: 方法 ,通過它可以獲取更多關於NSDate的信息,因此需要傳入三個實參,所以該方法名包含三個冒號。
什麼叫做消息的嵌套發送,可以看下面的例子:
#importint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... double seconds =[[NSDate date] timeIntervalSince1970]; NSLog(@"%f",seconds); } return 0; }
[[NSDate date] timeIntervalSince1970];這種形式就是消息的嵌套發送。
唯一必須以嵌套的形式連續發送的消息是alloc和init。每個類都有一個alloc類方法,它能夠創建一個新的對象,並返還指向該對象的指針。通過alloc創建出來的對象,必須經過初始化才能使用。每個類也都有一個init實例方法,它用來初始化實例。
#importint main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSDate *today=[[NSDate alloc] init]; NSCalendar *calendar=[NSCalendar currentCalendar]; unsigned long day=[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:today]; NSLog(@"%lu",day); } return 0; }
使用以上方法和發送date消息創建NSDate對象沒有區別。NSDate的init方法會將NSDate對象初始化為當前的日期和時間,就像date方法那樣。
在Object-C中,nil是值為0的指針。同時向nil發送消息,什麼事情也不會發生。
當聲明指向對象的指針時,通常都會明確地寫出相應對象的類,但是在編寫程序時,很可能會碰到聲明指針時並不知道所指對象的類型,因此,可以使用id類型來表示。
id student;
id類型的含義是:可以指向任意類型Object-C對象的指針。