类和对象 (Object-C语言)
类和对象
自动释放池
@autoreleasepool
C语言
printf("Hello, World!%d\n", a);
OC中的打印函数
NSLog(@"Hello, World!%d", a); NSLog(@"你好!");
NSLog比起printf增加的功能
1.自动换行
2.附加其他的信息(日期, 工程名)
注: NSLog比较消耗资源, 程序上传APPStore之前, 需要屏蔽掉NSLog
C语言的字符串 "iPhone"
OC中的字符串前要加@, @"iPhone"
乔布斯在NEXT公司时, 公司研发了一个NEXTStep的工具包, 后来乔布斯回到苹果, 也把这个工具包带回苹果, 集成到苹果的开发工具中, 所以iOS开发中很多都是以NS作为前缀
C语言和OC(Objective-C, Objc)的区别
1.OC是C语言的超集, OC是在C的基础上做的扩展, C语言的语法OC中都支持
2.OC扩充了面向对象的编程思想
3.OC是一门运行时语言, 编译时只检查语法, 运行时才能决定(比如执行方法, 数据类型等)
4.OC类库非常丰富
面向对象编程OOP(Object Oriented Programming)
面向对象编程的核心: 类, 对象
面向对象编程的三大特性: 封装, 继承, 多态
类:具有相同特征和行为的事物的抽象
对象: 万事万物皆对象
类与对象的关系
1.类是抽象的, 对象是具体的
2.对象是类的实例
3.类是对象的类型
如何区分类和对象?
看有没有具体到某个事物, 具体就是对象, 不具体就是类
OC中如何创建一个类?
1.cmd + n, 创建文件, 以CocoaTouch Class为模板创建一对文件(*.h 和 *.m)
2.在*.h中写实例变量和方法声明
3.在*.m中写方法实现
通过类来生成对象
1.引入头文件
2.开辟内存空间
3.初始化
OC中如何创建一个类?
汽车类
特征: 品牌, 价格, 轮子数量
行为: 跑, 停
Car.h
//@interface 类名 : 父类名 @interface Car : NSObject{ //实例变量 - 类的特征 // char brand[20]; // float price; // int number; //实例变量能在外部访问, 需要加public @public //NSString: OC中字符串类型 NSString *_brand; //CGFloat: OC中的浮点型, 在64位下是double, 在32位下是float CGFloat _price; //NSInteger: OC中的整型, 在64位下是long, 在32位下是int NSInteger _number; //注: 基本数据类型(char, short, int, long, float, double, BOOL), 不加* //实例变量命名以下划线开头 }
//方法 - 类的行为 //C语言的函数声明 //void run(); //OC的方法声明 //-/+: 决定方法由谁调用, -: 对象调用; +: 类调用 //(void): 返回值类型 //run: 方法名 - (void)run; - (void)stop;
Car.m
//@implementation - @end: 实现部分 @implementation Car //方法实现 - (void)run{ //在类的内部, 通过实例变量名, 访问实例变量 // NSLog(@"%@汽车跑起来了!", _brand); NSLog(@"%ld个轮子的%@汽车, 竟然跑起来了!", _number, _brand); } - (void)stop{ NSLog(@"%@根本停不下来!", _brand); } @end
main.m
OC中调用方法使用[]
//类 *对象 = // Car *car = [Car alloc];//使用alloc开辟内存空间 // [car init];//使用init初始化(把内存中的内存清空) Car *car = [[Car alloc] init]; //为实例变量赋值 car->_brand = @"奇瑞"; car->_price = 2000.0; car->_number = 3; //打印实例变量的值 NSLog(@"品牌: %@", car->_brand); NSLog(@"价格:%.2lf", car->_price); NSLog(@"轮子数量:%ld", car->_number); //调用方法 //格式: [类/对象 方法名]; [car run]; [car stop]; //定义一个汽车对象 Car *car2 = [[Car alloc] init]; car2->_brand = @"奥迪"; car2->_price = 3000.0; car2->_number = 4; NSLog(@"品牌: %@ 价格: %.2lf 轮子数量: %ld", car2->_brand, car2->_price, car2->_number); [car2 run]; [car2 stop];
手机类phone
特征: 颜色, 系统
行为: 打电话, 发短信
Phone.h
@interface Person : NSObject { @public NSString *_name; } - (void)say:(NSString *)content; @end
Phone.m
@implementation Person - (void)say:(NSString *)content { NSLog(@"%@: %@", _name, content); } @end
main.m
Phone *phone = [[Phone alloc] init]; phone->_color = @"土豪金"; phone->_system = @"iOS"; NSLog(@"颜色: %@ 系统: %@", phone->_color, phone->_system); [phone call]; [phone sendMessage]; [phone callToSomeone:@"Mr.Wang"]; [phone sendMessageToSomeone:@"Mr.Zhang"];
面向过程解决问题的思路
1.分析解决问题的步骤
2.把解决步骤形成函数
3.依次调用函数
面向对象解决问题的思路
1.分析问题中出现的对象
2.分析对象的特征和行为, 把具有相同特征的行为和对象归纳成类
3.通过类创建对象
4.通过对象去解决问题
去逛夜市,我:这个怎么卖。摊主:380这个是真金的。我:10块。摊主:看清楚啊这个是真金。我:10块。摊主:好吧!看你那么执着卖你吧。我:我不买,就练练砍价。摊主:你别跑,你别跑,劳资砍死你
*.h
@interface People : NSObject { @public NSString *_name; } - (void)say:(NSString *)content; - (void)write:(NSString *)content; @end
*.m
@implementation People - (void)say:(NSString *)content { NSLog(@"%@说: %@", _name, content); } - (void)write:(NSString *)content { NSLog(@"%@写下: %@", _name, content); } @end
main.m
Person *me = [[Person alloc] init]; me->_name = @"我"; Person *boss = [[Person alloc] init]; boss->_name = @"摊主"; [me say:@"这个怎么卖。"]; [boss say:@"380这个是真金的。"]; [me say:@"10块。"]; [boss say:@"看清楚啊这个是真金。"]; [me say:@"10块。"]; [boss say:@"好吧!看你那么执着卖你吧。"]; [me say:@"我不买,就练练砍价。"]; [boss say:@"你别跑,你别跑,劳资砍死你!"];
文件名和类名没有关系, 保持一致是为了方便管理
一对文件中可以写多个类, 但建议一堆文件只写一个类, 同样也是为了方便管理