IOS 開發 Objective-C 入門1

一、類的定義

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
單例模式的實現步驟:

  1. 在實現文件中定義一個靜態的本類的指針;
  2. 實現getInstance方法;
  3. 重寫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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章