一、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的方法2>帶一個參數的方法
// 方法聲明
- (double)pi;
// 方法實現
- (double)pi
{
return 3.14;}
設計一個計算平方的方法3>帶多個參數的方法// 方法聲明 - (double)square:(double)number; // 方法實現 - (double)square:(double)number { return number * number; }
設計一個計算和的方法4>方法名注意:// 方法聲明 - (double)sumOfNum1:(double)num1 andNum2:(double)num2; // 方法實現 - (double)sumOfNum1:(double)num1 andNum2:(double)num2 { return num1 + num2; }
1.冒號也是方法名的一部分5>OC方法注意:
2.同一個類中不允許兩個對象方法同名 OC方法中
3.一個參數對應一個冒號
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.函數內部不能直接通過成員變量名訪問某個對象的成員變量