OC基礎語法and類和對象

一、OC基礎語法

1、關鍵字
基本上所有關鍵字都是以@開頭,如:
@interface   @implementation   @end 
@public   @protected   @private   @selector 
@try   @catch   @throw   @finally  
@protocol   @optional   @required   @class
@property   @synthesize   @dynamic
self   super   id   _cmd   __block   __strong   __weak

2、字符串以@開頭
比如@"Hello"是OC中的字符串,而"Hello"則是C語言中的字符串

3、其他語法
基本數據類型:char、int、float、double、BOOL(YES\NO)
屏幕輸出:NSLog(@“XXXXX”);NSLog(@“XXXisXX %i”,XX);

4、NSLog與printf的區別
NSLog接收OC字符串作爲參數,printf接收C語言字符串作爲參數
NSLog輸出後會自動換行,printf輸出後不會自動換行
使用NSLog需要#import
使用printf需要#include

5、一般形式:

#import <Foundation/Foundation.h>
int main()
{
    NSLog(@"helloworld");
    return 0;
}


6、#import的作用
跟#include一樣,用來拷貝某個文件的內容
可以自動防止文件內容被拷貝多次,也就以爲着頭文件中不用加入下面的預處理指令了
#ifndef _STDIO_H_
#define _STDIO_H_
#endif

7、Foundation框架的作用
1.開發OC、iOS、Mac程序必備的框架
2.此框架中包含了很多常用的API(應用編程接口)
3.框架中包含了很多頭文件,若想使用整個框架的內容,包含它的主頭文件即可
#import
說明:
 1> 主頭文件:最主要的頭文件,名字一般跟框架名稱一樣,包含了框架中的所有其他頭文件
 2> Foundation框架的主頭文件名稱就是Foundation.h
 3> 只需要包含Foundation框架主頭文件,就可以使用整個框架的東西
 
 運行過程:
 1> 編寫OC源文件:.m、.c
 2> 編譯:cc -c xxx.m xxx.c
 3> 鏈接:cc xxx.o xxx.o -framework Foundation
   (只有用到了Foundation框架才需要加上-framework Foundation)
 4> 運行:./a.out

8、BOOL的使用
BOOL類型的變量有2種取值:YES、NO
#define YES (BOOL)1
#define NO  (BOOL)0
BOOL的輸出(當做整數來用)
NSLog(@"%d %d", YES, NO);

9、多個.m文件的開發
  跟C語言中多個.c文件的開發是一樣的

  編寫3個文件

// main.m
#import "one.h"
int main()
{
    test();
    return 0;
}
// one.h
void test();
// one.m
#import <Foundation/Foundation.h>
void test()
{
    NSLog(@"調用了test函數");
}

終端指令
編譯:cc –c main.m test.m
鏈接:cc main.o test.o –framework Foundation
運行:./a.out

10、.m文件和.c文件混用開發

  編寫3個文件

// main.m
#import "one.h"
int main()
{
    test();
    return 0;
}
// one.h
void test();
// one.m
#import
void test()
{
    NSLog(@"調用了test函數");
}

終端指令
編譯:cc –c main.m one.c
鏈接:cc main.o one.o
運行:./a.out
(沒有使用Foundation框架的話,就不用-framework Foundation)

二、OC的類和對象
1、類的聲明
1)類的設計:
1> 類名
* 類名的第一個字母必須是大寫
* 不能有下劃線
* 多個英文單詞,用駝峯標識(每個單詞首字母大寫)
2> 屬性
3> 行爲(功能)

注:擁有相同(或者類似)屬性和行爲的對象都可以抽像出一個類

#import <Foundation/Foundation.h>
// 類的聲明
@interface Car : NSObject
{
    @public
    int wheels; // 多少個輪子
    int speed;  // 時速
}
- (void)run;    // 跑的行爲
@end

成員變量
@interface的大括號{}中聲明的變量:wheels、speed
@interface的大括號和函數的大括號是不一樣的
默認會初始化爲0

@public
@public可以讓Car對象的wheels和speed屬性被外界訪問

NSObject
加上:NSObject的目的是讓Car類具備創建對象的能力

2、類的實現
用來實現@inteface中聲明的方法
方法的實現(說清楚方法裏面有什麼代碼)

// 類的實現
@implementation Car
- (void) run
{
    NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end

1.只要是OC對象的方法,必須以減號 - 開頭
2.OC方法中任何數據類型都必須用小括號()擴住
3.OC方法中的小括號():括住數據類型

注:

沒有@interface,只有@implementation,也是能成功定義一個類的

@implementation Car : NSObject
{
    @public
    int wheels; // 多少個輪子
    int speed;  // 時速
}
- (void) run
{
    NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end
// @implementation中不能聲明和@interface一樣的成員變量


3、創建對象

    代碼編寫

// 主函數
int main()
{
    // 創建車子對象
    Car *c = [Car new];
    c->wheels = 3;
    c->speed = 300;
    
    [c run];
    return 0;
}

注:
1.在OC中,想執行一些行爲,就寫上一個中括號[行爲執行者 行爲名稱]
2.利用類來創建對象
3.執行了Car這個類的new行爲來創建新對象
4.定義了一個指針變量p,p將來指向的是Car類型的對象
5.[Car new]每次都會創建出一個新對象,並且會返回新對象本身(新對象的地址)

main函數的代碼分析、內存分析(對象在內存中有成員)
[Car new]每次都會創建出新的對象,並且返回對象的地址,那麼就應該用一個指針變量保存對象的地址
Car *c = [Car new];
用一個指針變量c指向內存中的Car對象
設置車子對象的屬性
跟用指向結構體的指針訪問結構體屬性一樣,用->
c->wheels = 3;
c->speed = 300;

4、創建多個Car對象

     分別只設置wheels、speed屬性

Car *c1 = [Car new];
c1->wheels = 4;
Car *c2 = [Car new];
c2->speed = 250;
[c1 run];
一個賦值給另一個,然後修改屬性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];

    常見錯誤:
只有類的聲明,沒有類的實現
漏了@end
@interface和@implementation嵌套
兩個類的聲明嵌套
成員變量沒有寫在括號裏面
方法的聲明寫在了大括號裏面

5、方法
    1>不帶參數的方法
設計一個返回PI的方法
// 方法聲明
- (double)pi;
// 方法實現
- (double)pi
{
    return 3.14;

}

    2>帶一個參數的方法
設計一個計算平方的方法
// 方法聲明
- (double)square:(double)number;
// 方法實現
- (double)square:(double)number
{
    return number * number;
}
    3>帶多個參數的方法
設計一個計算和的方法
// 方法聲明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法實現
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
    return num1 + num2;
}
    4>方法名注意:
1.冒號也是方法名的一部分
2.同一個類中不允許兩個對象方法同名 OC方法中
3.一個參數對應一個冒號
    5>OC方法注意:
1.成員變量不能在{}中進行初始化、不能被直接拿出去訪問
2.方法不能當做函數一樣調用
3.成員變量\方法不能用static等關鍵字修飾,別跟C語言混在一起
4.類的實現可用寫在main函數的後面,主要在聲明後面就行了
5.方法只有聲明,沒有實現
6.方法沒有聲明,只有實現(編譯器警告,但是能調用,OC的弱語法)
7.編譯的時候:訪問沒有的成員變量直接報錯,訪問沒有的方法,只是警告

 6、方法和函數的區別:  
 方法
 1.對象方法都是以減號 - 
 2.對象方法的聲明必須寫在@interface和@end之間
   對象方法的實現必須寫在@implementation和@end之間
 3.對象方法只能由對象來調用
 4.對象方法歸類\對象所有
 
 函數
 1.函數能寫在文件中的任意位置(@interface和@end之間除外),函數歸文件所有
 2.函數調用不依賴於對象
 3.函數內部不能直接通過成員變量名訪問某個對象的成員變量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章