1.ObjC跟C的區別與聯繫
首先 ObjC是一個面向對象的語言(封裝、繼承、多態) ObjC相當於C的一個超集即ObjC允許使用任何C語言代碼但增加了許多C沒有的特點 bigger easier
2.ObjC中的類與對象
類由接口( XX.h @interface)和實現(XX.m @implementation)兩部分構成
XX.h中聲明類中的實例變量和功能
XX.m中實現.h中的功能
注意:
命名規則 類名首字母大寫 Student 方法名首字母小寫(駝峯)-(void)sayHi
- 實例方法 + 類方法
3.類的創建和使用
1)聲明:在.h文件中
#import<Foundation/Foundation.h>
@interface Student : NSObject //NSObject父類名 Student類名
{
實例變量int _age; //實例變量分爲@protect @private @public默認@protect
}
- (void)setAge:(int)age; //聲明方法
- (int)getAge;
- (void)sayHi;
@end
2)實現:在.m文件中
#import"Student.h" //要包含.h文件
@implementation Student
-(void)setAge:(int)age //方法的實現
{
int _age=age;
}
-(int)getAge
{
return _age;
}
-(void)sayHi
{
}
@end
3)調用:在別的類中
#import"Student.h"
Student *s=[[Student alloc]init]; //alloc分配內存空間 init初始化
s.name=@"tt"; //只有用了@Property @synthesize s.name才能用 俗稱點語法 self.name
[s sayHi]; // 不然只能通過實例方法訪問實例變量(因爲默認@protected)如果是public可以用 s->name訪問(s本質上是指針)
屬性:@property(non atomic,retain)NSString *name; //相當於聲明瞭setter getter方法
@synthesize name = _name; //在.m文件中相當於實現了setter getter方法 _name相當於在.h文件中聲明瞭一個實例變量只是沒看到
注意:
@property()裏邊的屬性
訪問控制: readwrite(默認方式) readonly(就沒有setter方法)
內存管理:assign 用於基本類型 retain用語對象 copy需要實現NScoping
線程安全:atomic(默認) nonatomic非原子性(一般用非原子性)
4.初始化方法
1)指定初始化方法:實例方法
聲明:
-(id)initWithName:(NSString *)name;
實現:
-(id)initWithName:(NSString *)name
{
self=[super init]; //調用父類的指定初始化方法 以此判斷指定初始化方法
if (self)
{
_name=name;
}
return self;
}
2)一般初始化方法:實例方法
聲明:
-(id)initWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate;
實現:
-(id)initWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate
{
self=[self initWithName:name];
if (self)
{
_name=name;
_age=age;
_sex=sex;
_talent=talent;
_mate=mate;
}
return self;
}
調用:
Rider *r=[[Rider alloc]initWithName:@"rider"andAge:25 andSex:@"M"andTalent:@"HP 30,MP 0,SP 30"andMate:nil];
注意:
通常以init開頭 返回值爲id
一個類只有一個指定初始化方法
指定的初始化方法是必須執行的
內部實現會調用到父類的初始化方法
3)便利構造器:類方法
聲明:
+(id)machineWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate;
實現:
+(id)machineWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate
{
Machine *mac=[[Machine alloc]initWithName:name andAge:age andSex:sex andTalent:talent andMate:mate]; //調用初始化方法
return [mac autorelease];//便利構造器內部已經實現內存管理
}
調用:
Machine *mac=[Machine machineWithName:@"machine"andAge:5 andSex:@"?"andTalent:@"HP 10,MP 0,PW 100"andMate:nil];
注意:
便利構造器方法以類名開頭
類方法內部不能用實例變量
類方法只能以類(名)來調用
4)單例模式:
聲明:
+(King *)defaultKing;
實現:
+(King *)defaultKing
{
static King *k=nil;
if (k==nil)
{
k=[[King alloc]init];
}
return k;
}
調用:
King *k=[King defaultKing];
k.name=@"king";
k.age=100;
k.sex=@"M";
k.talent=@"PH 10,MP 10";
k.mate=nil;
注意:
單例對象的類只能有一個實例 再次調用得到本來的內存地址