面向對象的程序設計中有兩個重要概念:類(class)和對象(object),類事某一批對象的抽象,對象是一個具體存在的實體。
Objective-C定義類需要氛圍2個步驟
定義接口部分的語法:
@interface MyClass:NSObject
{
int count;
id data;
NSString* _name;
}
-(id)initWithString:(NSString)aName;
+(MyClass)createMyClassWithString:(NSString* aName);
@end
@interface用于聲明定義類的接口部分,@end表明定義結束。其后緊跟該類d一對花括號用于聲明該類的成員變量;花括號后面的部分用于聲明該類的方法。定義類的接口聲明部分防災頭文件中。
定義成員變量
類型 成員變量名;
聲明方法:
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
方法類型標識:+ 或者- ,+代表該方法是類方法,直接類型即可調用;-代表該方法是實例方法,必須對象才能調用。
返回值類型:可以是OC允許的任何數據類型。
方法簽名關鍵字:由方法名,行參標簽和冒號組成。OC建議為后面的每個行參都指定一個行參標簽,該行參標簽可以很好的說明該行參的作用。
Objective-C的方法聲明中,所有的類型(包括void)都應該使用圓括號括起來。
定義實現部分的語法:
@implementation MyClass { int _count; id _data; NSString* _name; } -(id)initWithString:(NSString*)aName { //方法體 } +(MyClass*)createMyClassWithString:(NSString*)aName { //方法體 }
說明:
定義變量: 類名* 對象名
創建對象: [[類名 alloc] 初始化方法]
alloc是OC的關鍵字,負責為類分配內存空間,創建對象,調用初始化方法對該實例執行初始化。所有的對象都繼承類NSObject ,所有的類都有一個默認的初始化方法:init
.
也可以使用new創建對象 [類名 new]
OC調用方法的語法為:[調用者 方法名:參數 行參標簽:參數值 ...]
self關鍵字總是指向調用該方法的對象。self關鍵字最大的作用是讓類中的一個方法訪問該類中另一個方法或者成員變量。
#import <Foundation/Foundation.h>@interface FKWorf:NSObject{ NSString* _name;}-(void) setName:(NSString*)_name;-(void) info;@end@implementation FKWorf-(void) setName:(NSString*) n{ self->_name = n;}-(void) info{ NSLog(@"我是%@",self->_name);}@end int main(int argc, char const *argv[]){ @autoreleasepool { FKWorf* worf = [[FKWorf alloc] init]; [worf info]; } return 0;}
任意類型的對象都可復制給id類型的變量
id p = [[FKWorf alloc] init];[p info];
OC中方法的所屬性:
定義方法時,在最后一個形參后增加逗號和三點(,...),則表明該形參可以接受多個參數值。
長度可變的形參只能處于形參列表的最后,一個方法中最多只能包含一個長度可變的形參。
定義語法:-(void)test:(NSString*)name,...
獲取形參:
-(void)test:(NSString*)name,...{ va_list argList; //如果第一個name參數存在,才需要處理后面的參數 if(name) { NSLog(@"%@",name); va_start(argList,name); NSString* arg = va_arg(argList,id); while(arg) { NSLog(@"%@",arg); arg = va_arg(argList,id); } va_end(argList); }}
成員變量指的是在類接口部分或類實現部分定義的變量,OC的成員變量都是實例變量。
訪問實例變量 實例->實例變量
聲明實例變量,系統會為實例變量執行默認初始化,基本類型的實例變量默認被初始化為0,指針類型的成員變量默認被初始化nil
封裝是指將對象的狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息 ,而是通過該類提供的方法類實現對內部信息的操作和訪問。
4個訪問控制符:@PRivate
,@package
,@protected
,@public
@package修飾的成員變量,可以在當前類和同一鏡像的中訪問,同一鏡像是指,編譯后生成的同一個框架或同一個執行文件
@property
指令定義屬性。使用@property
定義屬性無需放在類接口的花括號里,直接放在@interface
、@end
之間。@property
指示符放在屬性定義的最前面。@synthesize
指令聲明該屬性。以上步驟會合成成對的setter和getter方法,還會自動在類實現部分定義一個與getter方法同門的成員變量。
@sythesize property名[=成員變量名]
#import <Foundation/Foundation.h>@interface FKUser:NSObject@property (nonatomic) NSString* name;@property NSString* pass;@property NSDate* birth;//-(void)setName:(NSString*) name;@end@implementation FKUser@synthesize name=_name;@synthesize pass;@synthesize birth;-(void)setName:(NSString*) name{ self->_name=[NSString stringWithFormat:@"+++%@",name];}@endint main(int argc, char const *argv[]){ FKUser* user=[[FKUser alloc] init]; [user setName:@"唐僧"]; [user setPass:@"1234"]; [user setBirth:[NSDate date]]; NSLog(@"name=%@,pass=%@,birth=%@",[user name],[user pass],[user birth]); return 0;}
@property
和類型間用括號的額外指示符
assign
指定對屬性只是簡單賦值,不更改對所賦的值的引用計數。用于NSinteger及short float double 結構體等C數據類型atomic
(nonatomic
) 默認atomic,指定合成的方法是否為原子操作,當一個線程進入存取方法的方法體后,其他線程無法進入該存、去方法,避免多線程冰法破壞對象的完整性。copy
使用copy,當調用setter方法對成員變量賦值時,會將被賦值的對象復制一個副本,再講該副本賦值給成員變量。getter
、setter
用于為合成的getter、setter方法指定自定義方法名@property (assign,nonatomic,getter=wawa,setter=nana:) int price;
readonly
,readwrite
(默認) ,readonly 指示系統只合成getter方法retain
屬性賦值時,原來所引用的對象的引用計數器減1,被賦值的對象引用計數加1strong
,weak
強引用、弱引用,強引用指向被賦值的對象,name對象就不會自動回收;弱引用指向的對象可能被回收unsafe_unretained
與weak
相似,unsafe_unretained所引用的對象被回收后,unsafe_unretained指針不會被賦值為nil
,可能導致程序崩潰
|
新聞熱點
疑難解答