標籤:
1.C語言面向過程,OC物件導向
2.第一個OC程式
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0;}
1)import引入標頭檔可以防止重複包含
2)Foundation/Foundation.h檔案包含了很多標頭檔,引入這個等於把OC的庫檔案都引過來了
3)@autoreleasepool
4)NSLog與printf比較
NSLog自動換行,printf不會
NSLog會輸出時間等項目資訊,printf不會輸出調試資訊
NSLog函數的參數是一個NSString對象,printf是一個字串常量指標
列印字串用%@,NSString *[email protected]"ancc";NSLog(@"%@",str1);
[email protected]""代表字串
4.文檔注釋
/**
*
**/
5.增強型for迴圈
6.類的定義
//// main.m// OC1//// Created by fanyafang on 15/10/30.// Copyright © 2015年 itcast. All rights reserved.//#import <Foundation/Foundation.h>#pragma mark Person類@interface Person : NSObject{ @public int _age; NSString *_name;} -(void)getAge;@end@implementation Person -(void)getAge{ NSLog(@"dddd"); }@end#pragma mark int main(int argc, const char * argv[]) { @autoreleasepool {
Person *p=[Person new]; p->_age=10; NSLog(@"%d",p->_age);
[p getAge];
} return 0;}
7.記憶體的理解
代碼區:存放類定義,載入一次
堆區:存放案例變數,儲存了代碼區類的地址
棧區:存放對象
8.NSString的用法:
1)建立字串的方法
NSString *[email protected]"This is a String!";
NSString *s=[NSString new];
NSString *imgName=[NSString stringWithFormat:@"xxxxxxxx%02d.jpg",i];//格式化建立字串
NSString *s2=[[NSString alloc] initwithString:s1];//用一個已經存在的字串建立一個新的字串
2)輸出一個字串
NSLog(@"%@",asstring);
3)字串長度計算方法
C語言中用strlen函數
OC中用NSUInterger len=[s1 length];//NSUInterger無符號長整型
1個漢子按1個長度計算
9.OC的多檔案開發
標頭檔和類實現檔案分開編寫,用import包含
10.類方法的學習
11.匿名類
使用匿名類調用類方法:[[Car new] stop];
[Car new]等價於[[Car alloc]init]
匿名類的優點:可以簡化代碼,方便方法的調用;缺點:匿名對象執行個體化後只能正確的使用成員變數一次。
12.get-set方法的編寫
13.對象之間的關係:
組合(葡萄) 依賴(一個對象的方法參數是另一個對象) 關聯(擁有,一個類的成員是另一個類的對象)
13.OC中沒有重載,類的方法不能同名
14.static的用法
1)在方法中延長變數的生命週期
2)在實作類別中定義;在介面類中定義,只在讓前檔案中有效
15.self的使用
1)對象方法中,調用另一個對象方法
2)在類方法中,調用另一個類方法
3)修飾變數-在set方法中,形參與執行個體變數名稱相等,用self取執行個體變數
16.繼承
1)不能和父類定義一樣的變數
2)單一繼承,不支援繼承多個類
3)支援多層繼承子類也可以被繼承
17.案例變數修飾符
public:公開的,在其他類中也可以訪問
protected:受保護的類型,只能在當前類和子類中訪問
private:不能直接存取
.h檔案中沒有聲明的變數和方法,只在.m檔案中定義,不能被繼承和使用
18.%@列印對象的地址,預設調用對象的description方法,可以重寫此方法
19.多態:不同的對象以自己的方式響應相同名稱方法的能力稱為多態
父類指標指向子類的對象
20.類的本質是類對象
1)Class c1=[d class];Class c1=[d1 class];如果d和d1是同一個類的對象,那個c1和c2指向相同的地址
2)擷取方式,通過案例對象擷取Class c1=[d class];,通過類名擷取Class c1=[Dog class];
3)類對象的使用,代替類名new對象
21.SEL [email protected](test)//手動把test方法封裝成sel類型
[p performSelector:s1];//向test方法發送sel訊息,這兩句話相當於[p test];
22.點文法的本質是調用getter、setter方法,不是訪問成員變數
對象.屬性=...;//替換為set方法
...=對象.屬性;//替換為get方法
[email protected]的使用
寫在聲明檔案中,相當於定義get、set方法聲明
#import <Foundation/Foundation.h>@interface Animal : NSObject{ int _age;}@property int age;//-(void)setAge:(int)age;//-(int)age;@end
[email protected]的使用
寫在實現檔案中相當於注釋部分的代碼
#import "Animal.h"@implementation Animal@synthesize age;//-(void)setAge:(int)age{// self->age=age;//@synthesize age會自動建立一個age執行個體變數
//}//-(int)age{// return self->age;//}@end
@synthesize age=_age;//指定案例變數名,不會操作預設的變數
相當於:
//-(void)setAge:(int)age{// _age=age;//}//-(int)age{// return _age; //}
xcode4.4之後,可以只使用@property而不使用@systhesize,並且不用定義帶有底線的變數
操作的是帶有底線的案例變數,如果當前類沒有底線的案例變數,則系統會幫我們產生。注意該變數是私人的(相對的,隱藏的)子類看不到
@property的增強型,在.m檔案中重寫get、set方法,但是不能同時重寫,只能重寫一個
25.動態類型和靜態類型
動態類型:父類的指標指向子類的對象
靜態類型:
26.id的使用,id是一個萬能指標,可以指向任何對象
NSObject和id都可以指向任何對象
NSObject對象會進行編譯時間檢查(需要強制類型轉換)
id不需要強制類型轉換,id可以直接用
編譯器看到id以後,認為是動態類型,不在檢查
id obj=[Animal new];
27:動態綁定
內省
動態類型檢測:
1)判斷類型
1))判斷某個對象是否是類的執行個體對象,或者子類的案例對象
BOOL isKind = [ani isKindOfClass:[Animal class]];(對象和類)
2))判斷是否是這個類的案例,不管是否是這個類的子類的案例
isMemberOf(對象和類)
3))判斷是否是子類的案例
isSubClassOfClass
BOOL isKind = [Dog isSubClassOfClass:[Animal class]];(類和類)
2)方法響應的檢測
1))判斷對象能否響應指定的方法:
respondsToSelector:方法的SEL
2))判斷類能否響應指定的方法
instanceResponseToSelector:方法的SEL
3)回應程式法
無參:performSelector:SEL
有一個參數:performSelector:SEL withObject:@"參數"
有兩個參數:performSelector:SEL withObject:@"參數" withObject:@"參數2"
28.構造方法init,是一個對象方法,返回的是一個對象-調用init方法的對象
29.重寫構造方法
-(instancetype)init{ self = [super init]; if(self){ _age=10; } return self;}
Objective-C基礎