Objective-C学习笔记(一)–类
1、類的定義與實現
1.1說明
所有的類都是繼承NSObject。類的接口與實現是分開的,一般類的定義是放在.h文件【包含類的名稱、成員變量、方法、屬性、繼承關系 、遵從的協議】;實現部分是放在.m文件中【包含每個屬性和方法的具體實現以及協議的方法實現】
語法:【類的定義以@interface開頭以@end結束;類的實現以@implementation關鍵字開頭以@end結束】
Person.h
@interface Person:NSObject{
//類的成員變量區【類的成員變量聲明】
}
//類的方法與屬性區【類的方法與屬性的定義】
@end
Person.m
#import “Person.h”
@implementation Person{
}
@end
1.2實例化alloc
實例一個新的對象需要調用類的alloc靜態方法。alloc方法一旦調用就表明了向內存申請了一個空間用來保存該類的信息。
具體流程是:alloc會查看所有該類及所有基類,統計出這些類一共定義了哪些成員變量,總共需要多大的內存空間用來保存這些信息,然后向操作系統發出請求申請這些空間,如果成功,alloc方法會將所有的成員亦是置為0,除了一個特殊的指向其類元對象的成員之外,然后返回這塊申請下來的空間的首地址
流程圖:
2、成員變量與方法
2.1變量
變量分為成員變量和類的靜態變量。
成員變量
可訪問性:@protected、@private、@public
關鍵字可見性描述
@protected當前類及子類的實例方法可見默認值,類里聲明的成員變量的可訪問級別默認為@protected。
@private只對當前類的實例方法可見私有訪問級別
@publice成員變量對外可見
變量的聲明
@interface Person:NSObject{
@private
NSString *_name;
int _age;
}
靜態變量
使用static關鍵字表示,定義在類的實例部分中所有實例方法之外。類的靜態變量對于實例方法和類方法都是可見的。
@implementation Person
static int NumberPerson=0;
@end
2.2方法
方法的聲明語法
+|-(返回值類型)方法名;
+|-(返回值類型)參數1說明:(參數1類型)參數1名稱 參數2說明: (參數2類型)參數2名稱;
+:加號表示該方法是一個類的方法,類的靜態方法,它不屬于類的任何實例只屬于該類。【類似于Java中的static方法】 調用格式為 [類 方法名] 例: [Person setMaxAge:20];
-:減號表示該方法的實例方法,屬于實例。調用時必須先將實例化,然后再調用。調用格式為[類的實例 方法名]
例:Person *xiaoMing=[[Person alloc] init];//實例化
[xiaoMing setName:@”90worker”];
注意:
-(BOOL)likeFood:(NSString *)food;
方法名為likeFood: 【注意有個冒號】
-(id) initWithcName:(NSString *)name andAge:(int) age;
方法名為initWithcName: andAge: 【注意有多個冒號】
2.3選擇器@select
每一個Objective C方法都對應一個選擇器,即SEL類型的對象。
Objective C運行時通過方法對應的選擇來定位其實現代碼。可以通過@select指令 ,傳入方法名,可以獲取該方法的選擇器
用法 : SEL initMethodSelect=@select(initWithName:age:);
用途:通常用于指定回調方法。
2.4屬性@property
語法:@property (屬性的附加特性) 類型 名稱;.m文件實現用@synthesize關鍵字。【@synthesize 屬性名稱|@synthesize 屬性名稱=成員變量名稱】
聲明:@property (nonatomic,copy) NSString *name;
實現:@synthesize name;
屬性的附加特性:
關鍵詞描述
nonatomic線程安全的,編譯器默認會生成額外的代碼以保證訪問屬性的線程安全,會犧牲一定的性能。
readonly屬性只可讀,@synthesize指令只會生成get方法還沒有set方法
readwrite默認值。可讀寫
geter=get方法名,
setter=set方法名當聲明一個屬性用@synthesize指令會生成相應的get方法和set方法,但可以通過getter和setter來手動指定get方法和set方法
assign、retain、copy
調用:對過點.來實現調用
xiaoMing.name=@”90worker”;
點語法oc2.0以后
為什么設計點語法
1、為了方便別的程序員轉到OC開發來
2、為了讓程序設計簡單化
3、隱藏了內存管理細節
4、隱藏了多線程、同步、加鎖細節
2.5@class關鍵字
@class為前向聲明
現有兩個類的聲明
Wheel代表著輪子,Bike代表著自行車,我們知道Bike是需要Wheel的
于是有以下的代碼
Bike.h
@intefrace Bike:NSObject{
Wheel * _frontWheel, *_rearWheel;
}
@end
在這里我們用到了Wheel類,那么我們到底是用#import還是用@class呢?我們用一個表格來說明#import和@class
關鍵字描述
#import將Wheel類的外部接口Wheel.h整個導入,這樣會產生編譯依賴和編譯時間的浪費。如果Bike.h中導入了Wheel.h而Bike.h文件又被很多其他的類導入 了,那么這些類也會導入了Wheel.h,一旦Wheel.h修改了,所有導入了Wheel.h的文件都發生了變化需要重新編譯。
@class1、可以有效的解除上面所說的編譯依賴。如果Wheel.h修改了,對于那些導入了Bike.h的文件并沒有發生變化所以也不需要重新編譯。使用了@class關鍵字只是在類的定義中前身引用了,但在Bike類的內部實現中還是需要導入Wheel.h的,因為可能需要使用到Wheel.h中的某些定義方法
2、可以解決循環引用
2.6self關鍵字
self表示當前引用對象
記住以下兩句話:
1、誰在執行該函數 self就表示誰
2、super表示該對象的父對象
+(int)maxAge{
//
在+類方法 (靜方法) self表示本類【抽象】 對象是具體的、實例的
}
+(id) person{
id obj=[[self alloc] init];
//用法==[[Person alloc] init]; == [[[self class ] alloc] init]
//self=Person
return obj;
}
//調用 [xxx 方法名] maxAge方法里面的self表示
int maxAge=[Person maxAge];
2.7dealloc函數
dealloc【只調用一次】
對象從內存中銷毀前夕調用的函數
在對象完全消失的時候調用 對象的計數器為0的時候會自動調用dealloc 不能人為的去調用此方法。應用這樣調用:[xx release] //release計數器1減到0 系統就會自動的調用dealloc
-(void)dealloc{
//在調用父類之前做一些處理
[super dealloc];
}
2.8 initialize函數
+(void)initialize NSObject 這個類的第一次實例化的時候調用 第一次調用alloc 或者調用init的時候就會調用 【只調用一次】 類方法在該類第一次實例化的時候調用 并且只調用一次 在這里做一些static變量的初始化操作
轉載于:https://blog.51cto.com/jiahui524/1309263
總結
以上是生活随笔為你收集整理的Objective-C学习笔记(一)–类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java调用.NET webservic
- 下一篇: ntp的一个小错误