1. 面向對象編程
用解決現實中的問題的辦法來解決計算機問題。
1.1 對象
Anything is Object. 萬物皆對象。
現實中對象是一種客觀的存在,程序中對象是一片內存空間。
對象之間各司其職,各盡所能,對象功能單一。對象之間通過發消息來互相合作,形成一個系統。
對象
有什麼 屬性
能幹什麼 方法
1.2 類
就是類型,這兒理解爲用戶自定義的類型。
int double float ... 基本數據類型
TRDate ... 用戶自定義類型
類是一種主觀的認識,是對我們需要解決的問題的一種抽象,是創建對象的模型。
1.3 定義類
@interface 類名 : NSObject
屬性的定義
方法的聲明
@end
讓類繼承NSObject是因爲需要類擁有相應的能力,比如內存分配能力等。
@implementation 類名
方法的定義
@end
1.4 創建對象
類名* obj = [類名 alloc];
[obj 消息]; //給對象發消息
對象收到消息會調用方法。方法其實是一種特殊的函數。
2. 內存分配
OC中的對象全部放在堆中。 要使用堆中的對象,必須使用指針指向對象。經常把這個指針叫"引用"。要讓對象工作,就給對象發消息,如果對象響應消息,就會調用對應的方法。消息是通過引用發的。
堆內存,分配和釋放不是自動的,而是由程序控制的。
堆裏放的是對象,棧裏放的是引用,引用指向了對象。
3. 實際開發中類定義的文件分離
一個類,一般會分成兩個文件,一個.h,一個.m。
.h文件中定義類的interface部分,.m文件中定義類的implementation部分。類名和文件名應該保持一致。
//以下代碼在XCode下編寫main.m
#import <Foundation/Foundation.h>
@interface MyFirstClass : NSObject //繼承NSObject,是所有類的老祖宗,分配內存空間
@Property int prop1; //屬性的定義
- (void) method1; //方法的聲明
@end
//實現部分
@implementation MyFirstClass
- (void) method1
{
NSLog(@"我是一個方法");
}
@end
@interface TRDog : NSObject //狗類
@property NSString *name; //OC語言特有的類型,用戶自定義類型需指針
- (void)bark;
@end
@impementation TRDog
-(void)bark
{
NSLog(@"%@在旺旺的叫", self.name); //%@打印字符串
}
@end
TRDog* getDog()
{
TRDog *dog = [TRDog alloc];
dog.name = @"小Mu";
return dog; //對象在堆中,可以返回
}
int main(int argc, const char* argv[])
{
@autoreleasepool{
MyFirstClass *obj = [MyFirstClass alloc]; //對象的創建
[obj method1]; //調用方法
TRDog *dog = [TRDog alloc];
dog.name = @"旺財";
[dog bark];
TRDog *dog2 = getDog();
[dog2 bark];
//[obj release]; //編譯器會自動寫上
//[dog release];
//[dog2 release];
}
return 0;
}
//重新新建一個文件TREmployee.h,定義一個employee類
#import <Foundation/Foundation.h>
//類的接口部分
@interface TREmployee : NSObject
//定義屬性
@property NSString *name;
@property int age;
@property BOOL gender;
@property double salary;
//聲明部分
- (void) show;
@end
//新建一個文件TREmployee.m,寫implementation部分
#import "TREmployee.h" //需import
@implementation TREmployee
- (void) show
{
NSLog(@"%@,%@,%d,%.2lf", self.name, self.gender?@"男":"女", self.age, self.salary);
}
@end
//main.m中:
#import "TREmployee.h"
void test2()
{
TREmployee *e = [TREmployee alloc];
e.name = @"Daniel";
e.age = 30;
e.gender = YES;
e.salary = 123456.78;
[e show];
//[e release];
}
int main(int argc, const char* argv[])
{
@autoreleasepool{
test2();
}
return 0;
}