閱讀50 返回首頁    go 阿裏雲 go 技術社區[雲棲]


objective-c 有感

1. 在objective-c中使用#import<>導入係統頭文件,#import""導入用戶頭文件,#import可以保證頭文件隻被包含一次。 
2.  基本數據類型總結 
2.1 基本數據類型分類 
1) 整型 1. 在objective-c中使用#import<>導入係統頭文件,#import""導入用戶頭文件,#import可以保證頭文件隻被包含一次。 
2.  基本數據類型總結 
2.1 基本數據類型分類 
1) 整型 
    int,short int, long int 
2) 浮點型 
    float, double 
3) 字符型 
    char 
2.2 數據輸出格式: 
1) int 
輸出格式符:%i, %d, %o, %x 
   unsigned int 
輸出格式符:%u 
   short 
輸出格式符:%hi, %hd 
   unsigned short int 
輸出格式符:%hu 
   long int 
輸出格式符: %li, %ld 
   unsigned long int 
輸出格式符:%lu 
2) float,double 
輸出格式符:%f, %e, %g 
   long double 
輸出格式符: %lf 
3) char 
輸出格式符:%c,字符串為%s 
3. 語句 
 循環語句:for, while, do while, break, continue 
 分支:if, else, switch 
4. NSlog()函數:與printf()類似,向控製台輸出信息。但它增加了時間戳等一些特性。 
例:向控製台輸出hello world。 
   NSString *str = @"hello world"; 
   NSLog(@"%@", str); 
   %@表示輸出NSString類型; 
   雙引號的前麵的@表示這雙引號中的字符串應該作為cocoa的NSString元素來處理。 
5. 布爾類型BOOL:值為YES,NO; 
6. objective-c中的方括號: 
1) 用於通知某個對象該做什麼。 
2) 方括號內第一項是對象,其餘部分是你需要對象執行的操作。 
3) 在objective-c中通知對象執行某種操作,稱為發送消息。(也叫調用方法) 
7. 標識符id:是一種泛型,用於表示任何種類的對象。 
8. 類聲明@interface: 
例: 
@interface Circle:NSObject   //為Circle類定義接口;NSObject表示是父類。 
{//以下是數據成員 
   ShapeColor fillColor; 
   ShapeRect bounds; 

//以下是方法聲明 
-(void) setFillColor: (ShapeColor) fillColor;  //前麵的短線表明這是方法聲明 
                                   //短線後麵是方法的返回類型 
                                   //接著是方法名 
//冒號後麵是參數,其中(ShapeColor)是參數類型, 
fillColor是參數名 
-(void) setBounds:(ShapeRect) bounds; 
-(void) draw; 
//減號就是普通函數 
加號就是靜態函數 
@end     //結束聲明 
9. self,隱藏對象self對應於C中的this。 
   Self->fillcolor來訪問成員變量。 
10. 調用寫好的類和類函數: 
//創建新對象,使用缺省初始化函數 
    Bank *bankDefault = [[Bank alloc] init]; 
//調用方法: 
    [bank addAmount: 1]; 
    [bank print]; 
// 釋放對象: 
    [bankDefault free]; 
11. 兩個參數的方法: 
-(void) setTire: (Tire *) tire  //聲明 
      atIndex: (int) index; 
//使用 
[car setTire:tire atIndex:2]; 
objective-c高級特性: 
12. 繼承 
Objective-c不支持多繼承。 
Super 關鍵字:調用該類的父類; 
超類:父類的另一種說法。 
12. 自定義NSLog()輸出: 
在類中添加description方法就可以自定義NSLog()如何輸出對象。 
@implementation Tire 
-(NSString *) description 

   Return (@”I am a tire.”); 

Main() 

    NSLog(@”%@”,tire[0]); 

13. Foundation kit: 
Cocoa是由兩部分框架組成的:foundation kit [包括一些基礎類]和 application kit.【包括用戶接口對象和高級類】 
創建字符串: 
1) NSString *test; 
test=[NSString stringWithFormat:@"i'm %d years old!",23]; 
若在聲明方法時在方法前麵添加了加號,那就表示把這個方法定義為類方法【這個方法屬於類對象,而不是類的實例對象。 
NSArray類:可以存放任意類型的對象. 
它有兩個限製: 
1. 它隻能存儲objective-c的對象,但不能存儲C中的基本數據類型,如int , float, enum, struct等。 
2.不能存儲nil(對象的零值或NULL值);【因為在創建NSArray時,要在列表結尾添加nil代表列表結束。】 
2) 創建NSArray: 
NSArray *array; 
array=[NSArray arrayWithObjects:@"one",@"two",nil];  
NSString, NSMutableString類; 
NSString是不可變的,即一旦創建完成,就不能通過刪除字符或添加字符的方式來改變它; 
而NSMutableString是可變的。 
NSArray, NSMutableArray類; 
NSEnumerator枚舉; 
NSEnumerator *enum; 
enum=[array objectEnumerator]; 
Id thingie; 
While(thingie=[enumerator nextObject]){} 
NSDictionary:字典(關鍵字及其定義的集合。)【也成為散列表,關聯數組】,NSMutableDictionary類; 
NSNumber:用來包裝基本數據類型,如int ,char, float, bool;【將一個基本類型的數據包裝成對象叫做裝箱。】 
NSValue:它可以包裝任何類,NSNumber是它的子類。 
NSNull: 
 在cocoa中看到“CF”字樣時,就表示它是蘋果公司的Core Foundation 框架相關的內容。 
 NSAutoreleasePool:自動釋放內存池。 
4. 內存管理 
每個對象都有一個與之關聯的引用計數(也叫保留計數) 
當使用alloc, new 方法或通過 copy消息(生成接收對象的一個副本)創建一個對象時,對象的引用計數值被設為1; 
 給對象發retain消息時,增加該值; 
 發送release消息時,減少該值; 
當一個對象的引用計數值變為0時,objective-c會自動向對象發送一條dealloc消息。銷毀該對象。 
你可以在自己的對象中重寫該方法, 
使用retainCount消息,可以獲取引用計數器的值。 
-(id) retain; 
-(void) release; 
-(unsigned) retainCount;     
自動釋放池:autorelease pool; 
創建: 
NSAutoreleasePool *pool; 
pool=[[NSAutoreleasePool alloc] init]; 
銷毀: 
[pool release]; 
注意:xcode自動生成的代碼,銷毀pool池時,使用的是[pool drain],drain方法隻是清空釋放池,但不銷毀pool.所以在自己編寫代碼時還是使用 
release. 
而且,drain隻適用於MAC OS 10.4以上的版本,而release適用於所有版本。 
隻有在向某個對象發送autorelease消息時,該對象才會添加到NSAutoreleasepool中,才會被自動釋放。 
如:[car autorelease]; 
內存管理黃金準則: 
隻有通過alloc, new和 copy方法創建的對象,才需要程序員負責向該對象發送release或autorelease消息。 
而通過其他方法獲得的對象,則默認為已經被設置為自動釋放,所以不需要程序員做任何操作了。 
在objective-c 2.0中有垃圾回收機製, 
如果要對某個項目使用垃圾回收: 
項目信息--build選項卡--查詢"garb",出現“objective-c Garbage Collection”,將其值設置為“required[-fobjc-gc-only]” 
啟用垃圾回收後,通常的內存管理命令全都變成了空操作指令,不執行任何操作。 
開發iphone軟件,不能使用垃圾回收。 
5.         
對象初始化 
兩種創建新對象的方法: 
[類名 new] 
[[類名 alloc] init] 
這兩種方法是等價的,但cocoa的慣例是使用後者。 
alloc在為對象分配空間的同時,將這塊內存初始化為0; 
Init方法:初始化實例變量,使對象處於可用狀態。[返回類型為id,  返回的值描述了被初始化的對象] 
使用new創建新對象時,係統要完成兩個步驟: 
1.  為對象分配內存,即對象獲得一個用來存放其實例變量的內存塊; 
2.  自動調用init方法,讓該對象處於可用狀態。 
6.     
objective-c 2.0的新特性【隻適用於mac os x10.5及以上】 
@property :表示聲明了對象的屬性。這樣就不用再寫屬性的訪問器了。 
(他有copy, retain, readwrite, readonly等屬性) 
@synthesize:表示“創建該屬性的訪問器” 
點表達式 
7.     
類別 
類別(category)是一種為現有的類添加新方法的方式。 
類別的聲明: 
@interface NSString (NumberConvenience) //類名 (類別名) 
-(NSNumber) lengthAsNumber;            //擴充方法聲明 
@end 
使用時使用原來的類名,就可以調用他的所有類別中的方法。 
類別的局限性: 
1.    不能向類中添加新的實例變量; 
2.    在類別中的方法若與類中現有的方法重名,則類中的方法不可用,被類別中的新方法取代。 
類別的作用: 
1.    將類的實現分散到多個文件或框架中; 
2.    創建對私有方法的前向引用; 
【Cocoa中沒有真正的私有方法,則實現私有方法類似功能的方法為: 
先在類別中聲明方法;然後到現有類的實現中實現該方法。 
這樣這個類中的其他方法可以使用該方法,而其他外部的類就不會知道該方法的存在了。】 
3.    向對象添加非正式協議。 
【創建一個NSObject的類別稱為創建一個非正式協議。】 
委托delegate是一種對象,另一個類的對象會要求委托對象執行它的某些操作。 
受委托對象在某個時間(某個事件觸發)時,會自動通知委托對象執行委托方法。 
選擇器:@selector():選擇器隻是一個方法名稱,但它以objective-c運行時使用的特殊方式編碼,以快速執行查詢。圓括號中的內容是方法名。 
所以Car類的setEngine:方法的選擇器是:@selector(setEngine: 
受委托對象如何知道其委托對象是否能處理它(受委托對象)發送給它(委托對象)的消息? 
通過選擇器,受委托對象先檢查委托對象,詢問其是否能響應該選擇器。如果能,則向它發送消息。 
8.     
協議: 
正式協議是一個命名的方法列表。 
采用協議意味著必須實現該協議的所有方法。否則,編譯器會發出警告。 
正式協議就像JAVA中的接口一樣。 
聲明協議: 
@protocal NSCopying 
-(id) copywithzone:(NSZone *) zone; //方法列表 
@end 
采用協議: 
@interface Car:NSObject <NSCopying,NSCoding> //中括號中是要實現的協議列表 
{//實例變量列表} 
//方法列表 
@end 

    int,short int, long int 
2) 浮點型 
    float, double 
3) 字符型 
    char 
2.2 數據輸出格式: 
1) int 
輸出格式符:%i, %d, %o, %x 
   unsigned int 
輸出格式符:%u 
   short 
輸出格式符:%hi, %hd 
   unsigned short int 
輸出格式符:%hu 
   long int 
輸出格式符: %li, %ld 
   unsigned long int 
輸出格式符:%lu 
2) float,double 
輸出格式符:%f, %e, %g 
   long double 
輸出格式符: %lf 
3) char 
輸出格式符:%c,字符串為%s 
3. 語句 
 循環語句:for, while, do while, break, continue 
 分支:if, else, switch 
4. NSlog()函數:與printf()類似,向控製台輸出信息。但它增加了時間戳等一些特性。 
例:向控製台輸出hello world。 
   NSString *str = @"hello world"; 
   NSLog(@"%@", str); 
   %@表示輸出NSString類型; 
   雙引號的前麵的@表示這雙引號中的字符串應該作為cocoa的NSString元素來處理。 
5. 布爾類型BOOL:值為YES,NO; 
6. objective-c中的方括號: 
1) 用於通知某個對象該做什麼。 
2) 方括號內第一項是對象,其餘部分是你需要對象執行的操作。 
3) 在objective-c中通知對象執行某種操作,稱為發送消息。(也叫調用方法) 
7. 標識符id:是一種泛型,用於表示任何種類的對象。 
8. 類聲明@interface: 
例: 
@interface Circle:NSObject   //為Circle類定義接口;NSObject表示是父類。 
{//以下是數據成員 
   ShapeColor fillColor; 
   ShapeRect bounds; 

//以下是方法聲明 
-(void) setFillColor: (ShapeColor) fillColor;  //前麵的短線表明這是方法聲明 
                                   //短線後麵是方法的返回類型 
                                   //接著是方法名 
//冒號後麵是參數,其中(ShapeColor)是參數類型, 
fillColor是參數名 
-(void) setBounds:(ShapeRect) bounds; 
-(void) draw; 
//減號就是普通函數 
加號就是靜態函數 
@end     //結束聲明 
9. self,隱藏對象self對應於C中的this。 
   Self->fillcolor來訪問成員變量。 
10. 調用寫好的類和類函數: 
//創建新對象,使用缺省初始化函數 
    Bank *bankDefault = [[Bank alloc] init]; 
//調用方法: 
    [bank addAmount: 1]; 
    [bank print]; 
// 釋放對象: 
    [bankDefault free]; 
11. 兩個參數的方法: 
-(void) setTire: (Tire *) tire  //聲明 
      atIndex: (int) index; 
//使用 
[car setTire:tire atIndex:2]; 
objective-c高級特性: 
12. 繼承 
Objective-c不支持多繼承。 
Super 關鍵字:調用該類的父類; 
超類:父類的另一種說法。 
12. 自定義NSLog()輸出: 
在類中添加description方法就可以自定義NSLog()如何輸出對象。 
@implementation Tire 
-(NSString *) description 

   Return (@”I am a tire.”); 

Main() 

    NSLog(@”%@”,tire[0]); 

13. Foundation kit: 
Cocoa是由兩部分框架組成的:foundation kit [包括一些基礎類]和 application kit.【包括用戶接口對象和高級類】 
創建字符串: 
1) NSString *test; 
test=[NSString stringWithFormat:@"i'm %d years old!",23]; 
若在聲明方法時在方法前麵添加了加號,那就表示把這個方法定義為類方法【這個方法屬於類對象,而不是類的實例對象。 
NSArray類:可以存放任意類型的對象. 
它有兩個限製: 
1. 它隻能存儲objective-c的對象,但不能存儲C中的基本數據類型,如int , float, enum, struct等。 
2.不能存儲nil(對象的零值或NULL值);【因為在創建NSArray時,要在列表結尾添加nil代表列表結束。】 
2) 創建NSArray: 
NSArray *array; 
array=[NSArray arrayWithObjects:@"one",@"two",nil];  
NSString, NSMutableString類; 
NSString是不可變的,即一旦創建完成,就不能通過刪除字符或添加字符的方式來改變它; 
而NSMutableString是可變的。 
NSArray, NSMutableArray類; 
NSEnumerator枚舉; 
NSEnumerator *enum; 
enum=[array objectEnumerator]; 
Id thingie; 
While(thingie=[enumerator nextObject]){} 
NSDictionary:字典(關鍵字及其定義的集合。)【也成為散列表,關聯數組】,NSMutableDictionary類; 
NSNumber:用來包裝基本數據類型,如int ,char, float, bool;【將一個基本類型的數據包裝成對象叫做裝箱。】 
NSValue:它可以包裝任何類,NSNumber是它的子類。 
NSNull: 
 在cocoa中看到“CF”字樣時,就表示它是蘋果公司的Core Foundation 框架相關的內容。 
 NSAutoreleasePool:自動釋放內存池。 
4. 內存管理 
每個對象都有一個與之關聯的引用計數(也叫保留計數) 
當使用alloc, new 方法或通過 copy消息(生成接收對象的一個副本)創建一個對象時,對象的引用計數值被設為1; 
 給對象發retain消息時,增加該值; 
 發送release消息時,減少該值; 
當一個對象的引用計數值變為0時,objective-c會自動向對象發送一條dealloc消息。銷毀該對象。 
你可以在自己的對象中重寫該方法, 
使用retainCount消息,可以獲取引用計數器的值。 
-(id) retain; 
-(void) release; 
-(unsigned) retainCount;     
自動釋放池:autorelease pool; 
創建: 
NSAutoreleasePool *pool; 
pool=[[NSAutoreleasePool alloc] init]; 
銷毀: 
[pool release]; 
注意:xcode自動生成的代碼,銷毀pool池時,使用的是[pool drain],drain方法隻是清空釋放池,但不銷毀pool.所以在自己編寫代碼時還是使用 
release. 
而且,drain隻適用於MAC OS 10.4以上的版本,而release適用於所有版本。 
隻有在向某個對象發送autorelease消息時,該對象才會添加到NSAutoreleasepool中,才會被自動釋放。 
如:[car autorelease]; 
內存管理黃金準則: 
隻有通過alloc, new和 copy方法創建的對象,才需要程序員負責向該對象發送release或autorelease消息。 
而通過其他方法獲得的對象,則默認為已經被設置為自動釋放,所以不需要程序員做任何操作了。 
在objective-c 2.0中有垃圾回收機製, 
如果要對某個項目使用垃圾回收: 
項目信息--build選項卡--查詢"garb",出現“objective-c Garbage Collection”,將其值設置為“required[-fobjc-gc-only]” 
啟用垃圾回收後,通常的內存管理命令全都變成了空操作指令,不執行任何操作。 
開發iphone軟件,不能使用垃圾回收。 
5.         
對象初始化 
兩種創建新對象的方法: 
[類名 new] 
[[類名 alloc] init] 
這兩種方法是等價的,但cocoa的慣例是使用後者。 
alloc在為對象分配空間的同時,將這塊內存初始化為0; 
Init方法:初始化實例變量,使對象處於可用狀態。[返回類型為id,  返回的值描述了被初始化的對象] 
使用new創建新對象時,係統要完成兩個步驟: 
1.  為對象分配內存,即對象獲得一個用來存放其實例變量的內存塊; 
2.  自動調用init方法,讓該對象處於可用狀態。 
6.     
objective-c 2.0的新特性【隻適用於mac os x10.5及以上】 
@property :表示聲明了對象的屬性。這樣就不用再寫屬性的訪問器了。 
(他有copy, retain, readwrite, readonly等屬性) 
@synthesize:表示“創建該屬性的訪問器” 
點表達式 
7.     
類別 
類別(category)是一種為現有的類添加新方法的方式。 
類別的聲明: 
@interface NSString (NumberConvenience) //類名 (類別名) 
-(NSNumber) lengthAsNumber;            //擴充方法聲明 
@end 
使用時使用原來的類名,就可以調用他的所有類別中的方法。 
類別的局限性: 
1.    不能向類中添加新的實例變量; 
2.    在類別中的方法若與類中現有的方法重名,則類中的方法不可用,被類別中的新方法取代。 
類別的作用: 
1.    將類的實現分散到多個文件或框架中; 
2.    創建對私有方法的前向引用; 
【Cocoa中沒有真正的私有方法,則實現私有方法類似功能的方法為: 
先在類別中聲明方法;然後到現有類的實現中實現該方法。 
這樣這個類中的其他方法可以使用該方法,而其他外部的類就不會知道該方法的存在了。】 
3.    向對象添加非正式協議。 
【創建一個NSObject的類別稱為創建一個非正式協議。】 
委托delegate是一種對象,另一個類的對象會要求委托對象執行它的某些操作。 
受委托對象在某個時間(某個事件觸發)時,會自動通知委托對象執行委托方法。 
選擇器:@selector():選擇器隻是一個方法名稱,但它以objective-c運行時使用的特殊方式編碼,以快速執行查詢。圓括號中的內容是方法名。 
所以Car類的setEngine:方法的選擇器是:@selector(setEngine: 
受委托對象如何知道其委托對象是否能處理它(受委托對象)發送給它(委托對象)的消息? 
通過選擇器,受委托對象先檢查委托對象,詢問其是否能響應該選擇器。如果能,則向它發送消息。 
8.     
協議: 
正式協議是一個命名的方法列表。 
采用協議意味著必須實現該協議的所有方法。否則,編譯器會發出警告。 
正式協議就像JAVA中的接口一樣。 
聲明協議: 
@protocal NSCopying 
-(id) copywithzone:(NSZone *) zone; //方法列表 
@end 
采用協議: 
@interface Car:NSObject <NSCopying,NSCoding> //中括號中是要實現的協議列表 
{//實例變量列表} 
//方法列表 
@end 

最後更新:2017-04-02 15:15:18

  上一篇:go 馬雲:網購是打假良藥
  下一篇:go 數學家發現 Gmail 安全漏洞