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;
}