一、類的定義
Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject{
@public
NSString * _name;
int _age;
NSString * _hobby; // aihao
NSString * _address;
}
-(void) sayHello;
-(void) eat;
// getter / setter
@property (getter = getName,assign,nonatomic) NSString * _name;
@property (assign,nonatomic) NSString * _hobby;
@property (getter = getAddress,setter = setAddress:) NSString * _address;
@property int age;
//
@end
成員變量定義:
在objc中,把成員變量定義在一個{ }花括號中,並且可以爲成員變量加上可見性前綴 public | private | protected;方法定義:
方法定義的通用格式( -)+(返回值)+(方法名)+(參數列表);
屬性定義:
屬性定義通過 @property 標註來快速定義 類的getter和setter方法,標註了property的成員變量默認會生成setXXXValue()方法,如果想要生成getXXXValue方法,需要向property標註指定額外的參數;
Student.m
#import "Student.h"
@implementation Student
-(void) sayHello{
NSLog(@"hello da jia hao,wo shi %@, %d years old", _name,_age);
}
-(void) eat{
NSLog(@"wo xiang chi fan. %@", _name);
}
// getter / setter implement
@synthesize _name = name,_address = address,_hobby = hobby;
@end
在objc的類的實現文件中,需要把接口文件中定義的方法實現,如果接口文件中通過 @property 定義了屬性,則需要在實現文件中通過 @synthesize 標註來生成 @property指定的屬性getter或是setter;
屬性設置參數
1、原子性屬性:
nonatomic 非原子性,不保證多線程安全。
atomic 原子性,多線程訪問時較安全。默認
2、setter 語義屬性
assign 直接賦值 適用於基本數據類型。
retain 賦值時做內存優化 適用於對象類型。
copy 複製一個副本 適用於特殊的對象類型。
3、讀寫屬性
readwrite 可讀寫(既有設置器也有訪問器)默認。
readonly 只讀(只有訪問器沒有設置器)。
getter = 方法名 指定訪問器的方法名。
setter = 方法名 指定設置器的方法名。
二、類的繼承
CollegeStudent.h
@interface CollegeStudent : Student
{
@public NSString * _magor;
}
// init method
-(id) initWithName:(NSString *)name;
-(CollegeStudent *) initWithNameAndAge:(NSString *)name
age:(int)age;
@end
定義一個CollegeStudent類,繼承自Student類,該類接口文件定義了兩個快速初始化方法;CollegeStudent.m
#import "CollegeStudent.h"
@implementation CollegeStudent
//
-(void) eat{
NSLog(@"I'm a collegeStudent,I need't eat at all");
}
//
-(id) initWithName:(NSString *)name{
// call super init
self = [super init];
if(self){
_name = name;
}
return self;
}
//
-(CollegeStudent *) initWithNameAndAge:(NSString *)name age:(int)age{
// call method which has called super init
self = [self initWithName:name];
if(self){
_age = age;
}
return self;
}
@end
在快速初始化方法中,我們需要調用 [super init] 或者是已經調用了 [super init] 的快速初始化方法;
需要注意的是,快速初始化方法的返回類型只能是 id 或者是 本類的指針;
三、單例
Teacher.h
#import <Foundation/Foundation.h>
@interface Teacher : NSObject{
@public NSString *name;
}
+(id)getInstance;
@end
單例模式是指整個應用中只出現一個該類的實例對象,通常用getInstance()方法來表示;
Teacher.m
#import "Teacher.h"
@implementation Teacher
static Teacher *teacher1;
// Singleton getInstance
+(id)getInstance{
// static id teacher1 = nil;
if(teacher1 == nil){
NSLog(@"getInstance");
teacher1 = [[Teacher alloc]init];
}
return teacher1;
}
// override
+(id)allocWithZone:(struct _NSZone *)zone{
if( teacher1 == nil){
teacher1 = [super allocWithZone:zone];
teacher1->name = @"Teacher_Zone";
return teacher1;
}
return nil;
}
@end
單例模式的實現步驟:
- 在實現文件中定義一個靜態的本類的指針;
- 實現getInstance方法;
- 重寫allocWithZone方法;
需要注意的是,在單例模式中,方法的定義和之前的方法定義格式不一樣,這裏用的是 + 號,這其實是兩種方法的標識, - 號定義的方法需要通過類的實例才能調用,而 + 號定義的方法通過類名就能調用,類似java中的靜態方法和成員方法的關係;
四、Demo
上面我們定義了幾個類,以及實現他們的一些方法,現在我們就來通過一個demo來看如何去調用它們;
@autoreleasepool {
// create a obj(Student);
Student *stu = [[Student alloc]init];
stu->_name = @"ccflying";
stu->_age = 24;
// call method eat;
[stu eat];
// CollegeStudent initWithName
CollegeStudent *collegestu = [[CollegeStudent alloc]initWithName:@"ccflying"];
[collegestu eat];
NSLog(@"collegestu[name=%@]",collegestu->_name);
// CollegeStudent initWithNameAndAge
collegestu = [[CollegeStudent alloc] initWithNameAndAge:@"ccflying" age:24];
// Log name and age
NSLog(@"collegestu[name=%@,age=%d]",collegestu->_name,collegestu->_age);
// getter / setter
NSLog(@"collegestu getName=%@",[collegestu getName]);
// set name
[collegestu set_name:@"my name"];
NSLog(@"collegestu getName=%@",[collegestu getName]);
// set address
[collegestu setAddress:@"my address"];
NSLog(@"collegestu getAddress=%@",[collegestu getAddress]);
// point grammar
collegestu._address = @"my newAddress";
NSLog(@"collegestu getAddress=%@", collegestu.getAddress);
NSLog(@"collegestu age=%d", collegestu.age);
// SingleTon
Teacher *tea = [Teacher getInstance];
NSLog(@"%@",tea->name);
// changeName
tea->name = @"New_Name";
tea = [Teacher getInstance];
NSLog(@"%@",tea->name);
}
上面這段代碼的log輸入信息爲
2015-06-22 09:10:50.143 ObjC01[5339:303] wo xiang chi fan. ccflying
2015-06-22 09:10:50.154 ObjC01[5339:303] I'm a collegeStudent,I need't eat at all
2015-06-22 09:10:50.155 ObjC01[5339:303] collegestu[name=ccflying]
2015-06-22 09:10:50.173 ObjC01[5339:303] collegestu[name=ccflying,age=24]
2015-06-22 09:10:50.176 ObjC01[5339:303] collegestu getName=(null)
2015-06-22 09:10:50.176 ObjC01[5339:303] collegestu getName=my name
2015-06-22 09:10:50.179 ObjC01[5339:303] collegestu getAddress=my address
2015-06-22 09:10:50.182 ObjC01[5339:303] collegestu getAddress=my newAddress
2015-06-22 09:10:50.183 ObjC01[5339:303] collegestu age=24
2015-06-22 09:10:50.184 ObjC01[5339:303] getInstance
2015-06-22 09:10:50.185 ObjC01[5339:303] Teacher_Zone
2015-06-22 09:10:50.186 ObjC01[5339:303] New_Name
注意 point grammar(點語法)
點語法是指通過對象obj.xxx來設置或者獲取一個屬性的值,要想能夠使用點語法,當然也就得使用屬性 property;