首先來了解一下:
1.面向過程與面向對象
1.1面向過程編程
什麼是面向過程?
Procedure,流程;
主幹流程和分支流程;
子模塊,代碼的複用;
特點:所有的工作,一個人幹,不利於工程協作;
1.2 類和對象
1.2.1 從生活邏輯
┏ 類 ┓ ┏ 對象 ┓
┃ 人 ┃ 喬布斯 庫克
┃ 電腦 ┃ 你桌子上那臺 我桌子上這臺
類class(不佔用內存) 一個類的實例 instance(佔內存)
1.2.2從封裝角度
結構體:自定義的數據類型,封裝成員變量,屬性
函數:模塊,封裝子過程,方法
類:屬性和方法的結合,同時封裝了屬性和方法(行爲)
1.2.3從語言角度
類:類型
對象:變量,可讀可寫容器;常量,只讀不寫的容器;
1.2.4 從官方定義
類:一種數據抽象
對象:一種數據具象
2.OC語言與C語言的聯繫
2.1文件後綴名
c語言
oc 語言:*.m
2.2#import的作用
相當於#include,但比#include 更加智能,能避免頭文件重複包含
-》 NSLog函數和printf函數的區別
自動換行
有時間戳前綴
2.3OC的字符串和 C 語言字符串的區別
@符號開始的字符串是 OC 的;
無@符號前綴的則爲 C 的;
OC 字符串的代表符號是%@;
C 字符串的代表符號底%s;
OC字符串是一個對象;空間在堆區
C 語言字符串只是數據;空間在棧區
eg.oc語言簡單使用(輸出語句)
//相當於#include,但比其更加智能,避免頭文件的重複包含
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
//oc語言的關鍵詞以@符號開頭,@符號讀作at for
@autoreleasepool {
NSString* myName = @"hello!";
//NSLog的輸出,在程序的後臺,對應於前臺,在 iOS 中 UI界面是前臺,Command Line Interface是後臺
NSLog(@"Hello, World!");
NSLog(@"Hello, %@,%@.",myName,@"張三");
NSLog(@"Hello, %s.","hello");
}
return 0;
}
eg.oc語言創建一個類(方式一)
#import <Foundation/Foundation.h>
//類的聲明
@interface Person : NSObject{
NSString* nsName;
//char* name;
int age;
}
//'-'號開始的方法是實例方法;
//'+'號開始的方法是類方法
- (void)setAge:(int)_age;
@end
//類的實現
@implementation Person
- (void)setAge:(int)_age
{
age = _age;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
//類的使用
Person* person = [[Person alloc] init];
[person setAge:20];
}
return 0;
}
eg.oc語言創建一個類(方式二)
(1)頭文件Person.h
//類的聲明文件,類的接口文件
#import <Foundation/Foundation.h>
@interface Person : NSObject {
//@public//公開的,訪問權限最大//所有的對象都能訪問該屬性
//類的屬性//要用大括號括起來
int _number;//保存學號信息
//@protected//保護的,訪問權限中庸//只有自己和子類能訪問該屬性
NSString* _name;//下劃線開始的變量名作爲類的屬性變量,和形式參數相區別,這是工程習慣,代表該變量是對象內部的空間
//@private//私有的,訪問權限最小//只有自己能訪問該屬性
int _age;
}
//中綴函數名方式
//id 相當於void*
//id是泛型的對象指針類型
- (id)initWithNumber:(int)aNumber
andName:(NSString*)aName
andAge:(int)aAge;
//類的方法//不能用大括號
- (void)setNumber:(int)aNumber;
- (int)number;
- (void)setAge:(int)aAge;
- (int)age;
- (void)setName:(NSString*)aName;
- (NSString*)name;
@end
(2)實現文件Person.m
//需要包含頭文件
#import "Person.h"
@implementation Person
- (id)initWithNumber:(int)aNumber
andName:(NSString*)aName
andAge:(int)aAge
{
//super代表父類
//父類在幫對象初始化共同的繼承的變量
if (self = [super init]) {//nil表示空對象
//對象初始化自己特殊的變量
_number = aNumber;
_name = aName;
_age = aAge;
}
//self是一個指向對象自己的對象指針,該指針由 NSObject 提供
return self;
}
//對象的自描述方法,也是一個由 NSObject 遺傳的隱式方法,
//我們可以按照自己的意願,重寫該方法(也即覆蓋父類方法)
- (NSString *)description{
return [NSString stringWithFormat:@"學號:%d,姓名:%@,年齡:%d",_number,_name,_age];
}
- (void)setNumber:(int)aNumber{
//工程健壯性規範,加快運行時的效率
// if (_number != aNumber) {
// _number = aNumber;
// }
//對於非對象屬性,檢查可選
_number = aNumber;
}
- (int)number{
return _number;
}
- (void)setName:(NSString*)aName{
//針對對象類型的屬性,在設置值之前,必須檢查是否爲同一對象(指針)
if(_name != aName){
_name = aName;
}
}
- (NSString*)name{
return _name;
}
//setter方法,用於寫入對象內部的屬性數據
- (void)setAge:(int)aAge{
//設置對象內部的屬性值
_age = aAge;
}
//getter方法,用於讀取對象內部的屬性數據
- (int)age{
//返回對象內部的屬性值
return _age;
}
@end
(3)main.m文件
#import <Foundation/Foundation.h>
//導入類的頭文件
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//用類作爲模板來創建對象
//對象的數據類型是指針類型,並且它是指向堆空間的指針類型
//OC中,所有對象,都用指針來引用
Person * xiaoLi = [[Person alloc] initWithNumber:20 andName:@"小李" andAge:28];
//NSLog(@"xiaoLi對象的自描述信息爲:%@",[xiaoLi description]);
NSLog(@"xiaoLi對象的自描述信息爲:%@",xiaoLi);
//寫入 xiaoLi的屬性信息
//在 OC中必須通過方法,對對象屬性進行操作,以便保護對象的封裝性
//[xiaoLi setName:@"小李"];
//方法調用,又稱爲發送消息,對象接受消息
// [xiaoLi setAge:28];
// [xiaoLi setNumber:13];
//[xiaoLi initWithNumber:20 andName:@"小李" andAge:18];
NSLog(@"xiaoLi name:%@",[xiaoLi name]);
NSLog(@"xiaoLi age:%d",[xiaoLi age]);
NSLog(@"xiaoLi number:%d",[xiaoLi number]);
Person* p=[[Person alloc] init];
[p setNumber:22];
[p setName:@"哈哈"];
[p setAge:24];
NSLog(@"姓名:%@ 學號:%d 年齡:%d",[p name],[p number],[p age]);
}
return 0;
}