IOS开发学习笔记009
开始学习OC,时间不等人啊,要抓紧了。
基本知识
新建一个以.m结尾的文件,这既是oc的程序文件。在oc程序中完全兼容C语言。编译好链接类似。
oc包含头文件是使用#import <>
import 和include 的区别:
1:import和include一样的包含功能
2:import可以自动防止文件被重复拷贝
1 #import <Foundation/NSObjCRuntime.h>//NSLog头文件 2 //import 1:和include一样 3 // 2:可以自动防止文件被重复拷贝 4 int main() 5 { 6 NSLog(@"this is OC output");//自动换行 7 return 0; 8 }
如果使用Foundation框架,则编译的时候需要添加参数 cc -c -framework Foundation a.m
每个框架都有自己的主头文件,和框架名一样,包含所有头文件。
如果有多个文件,编译顺序和c语言一样: cc -c one.m two.m -framework Foundation
BOOL类型(OC特有的)
定义:typedef signed char BOOL;
两种取值:
#define YES (BOOL) 1
#define NO (BOOL) 0
1 #import <Foundation/Foundation.h> 2 3 int main() 4 { 5 BOOL b = YES;//1 6 BOOL b2 = NO;//0 7 8 NSLog(@"%d\t%d",b,b2);//1 0 9 return 0; 10 }
面向对象
万物皆对象。
常用术语
面向过程 Procedure Oriented
面向对象 Object Oriented,简称OO
面向对象编程 Object Oriented Programming,简称OOP
类和对象的区别
类是对象的抽象。
对象是类的实例。
类的构成:
1、类名
首字母大写,不能下划线,多个单词每个首字母大写
2、属性
3、行为(功能)
类的实现
1 /* 2 类 3 1、类名 4 首字母大写,不能下划线,多个单词每个首字母大写 5 2、属性 6 3、行为(功能) 7 */ 8 9 #import <Foundation/Foundation.h>//NSObject 10 11 //1、类的声明:属性和行为 12 @interface Car : NSObject//继承NSObject,使类具有创建对象的功能 13 { 14 //属性,也就是成员变量(实例变量),默认会初始化为0,默认是保护属性 15 @public 16 int wheels;//轮胎个数 17 int speed;//时速 18 } 19 20 //方法(行为):返回值,方法名,参数 21 //只要是oc对象的方法,必须以‘-’开头 22 //OC方法中任何数据类型都必须用"()"括起来 23 //OC方法中小括号就是用来括住数据类型 24 - (void) run; 25 26 @end 27 28 29 30 31 //2、类的实现,用力实现@interface中声明的方法 32 @implementation Car 33 //方法的实现 34 - (void) run 35 { 36 NSLog(@"Running!"); 37 } 38 @end 39 40 int main() 41 { 42 //创建对象,返回对象的地址 43 Car *p = [Car new];//OC中执行任何行为都需要这个 [行为执行者 行为]; 44 p->wheels = 4;//赋值 45 p->speed = 60;//赋值 46 47 [p run];//调用方法 48 49 NSLog(@"speed is %d!",p->speed);//输出速度 50 51 return 0; 52 }
在类创建对象之前会把类加载到内存中,每个对象还都有一个ISA 指针,指向这个类。
对象和函数的区别
- OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
- C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
- C函数不能访问OC对象的成员
- 低级错误:方法有声明,但是实现的时候写成了函数
1 #import <Foundation/Foundation.h> 2 3 4 //1、类的声明 5 @interface Person: NSObject 6 { 7 @public 8 int age;//年龄 9 double weight;//体重 10 } 11 12 13 - (void)walk;//行走 14 15 @end 16 17 //函数1 18 void test(int age,int wei) 19 { 20 age = 20; 21 wei = 200; 22 } 23 //函数2 24 void test1(Person *p) 25 { 26 p->age = 20; 27 p->weight = 200; 28 } 29 30 //2、类的实现 31 @implementation Person 32 //实现@interface中声明的方法 33 - (void)walk//行走方法的实现 34 { 35 NSLog(@"The person whoes age is %d and weight is %f is walking !",age,weight); 36 } 37 38 @end 39 40 int main() 41 { 42 Person *p1 = [Person new];//新建一个对象 43 p1->age = 25;//年龄赋值 44 p1->weight = 66.7;//体重赋值 45 [p1 walk];//walk方法调用 46 47 Person *p2 = [Person new];//新建一个对象 48 p2->age = 45;//年龄赋值 49 p2->weight = 77.0;//体重赋值 50 [p2 walk];//walk方法调用 51 52 //p2 = p1;//对象间赋值 53 54 //对象和函数 55 test(p1->age,p1->weight);//值传递,不改变原值 56 [p1 walk];//walk方法调用 57 test1(p1);//传地址,改变原值 58 [p1 walk];//walk方法调用 59 60 return 0; 61 }
@interface 和@implementation分工
@interface 就相当于钟表表面
@implementation就是钟表内部的-实现
常见错误
1、只有类的声明,没有类的实现
2、漏了@end
3、@interface和@implementation嵌套
4、两个类的声明嵌套
5、成员变量没有写在括号里面
6、方法的声明写在了大括号里面
方法和函数的区别
方法:
1、方法都是以减号开头的
2、方法声明必须写在@interface和@end之间
方法定义必须写在@implementation和@end之间
3、方法只能由对象来调用
4、方法归对象/类所有
函数:
1、函数归文件所有,能写在除#interface和@end之间的任意位置
2、函数调用不依赖与对象
类的简单设计
1 #import <Foundation/Foundation.h> 2 /* 3 学生类: 4 狗类 5 */ 6 7 8 //性别 9 typedef enum 10 { 11 SexMan,//男 12 SexWoman//女 13 } Sex; 14 //生日 15 typedef struct 16 { 17 int year;//年 18 int month;//月 19 int day;//日 20 } Date; 21 //颜色 22 typedef enum 23 { 24 ColorBlack,//黑色 25 ColorRed,//红色 26 ColorGreen//绿色 27 } Color; 28 29 //类的声明:狗 30 @interface Dog : NSObject 31 { 32 @public 33 double weight;//体重 34 Color curColor;//毛色 35 } 36 //方法声明 37 - (void) eat;//吃 38 - (void) run;//走 39 40 @end 41 42 43 @implementation Dog 44 45 //方法实现 46 - (void) eat 47 { 48 weight += 1; 49 NSLog(@"狗吃过体重是%f",weight); 50 } 51 52 - (void) run 53 { 54 weight -= 1; 55 NSLog(@"狗溜过体重是%f",weight); 56 } 57 58 59 @end 60 61 62 63 //类的声明 :学生 64 @interface Student : NSObject 65 { 66 @public 67 Sex sex;//性别 68 Date birthday;//生日 69 double weight;//体重 70 Color FavColor;//最喜欢的颜色 71 char *name;//姓名 72 //狗,对象中对象,指针 73 Dog *dog;//OC中得其他对象必须是指针 74 } 75 //方法声明 76 - (void) eat;//吃 77 - (void) run;//走 78 - (void) print;//输出 79 - (void) walkingDog;//遛狗 80 - (void) feadDog;//喂狗 81 @end 82 83 //类的实现 84 @implementation Student 85 //方法实现 86 - (void) eat 87 { 88 weight += 1; 89 NSLog(@"吃过体重是%f",weight); 90 } 91 92 - (void) run 93 { 94 weight -= 1; 95 NSLog(@"运动过体重是%f",weight); 96 } 97 98 - (void) print 99 { 100 NSLog(@"Sex is %d,birthday is %d-%d-%d,favourate color is %d",sex,birthday.year,birthday.month,birthday.day,FavColor); 101 102 } 103 104 105 - (void) walkingDog 106 { 107 [dog run]; 108 } 109 - (void) feadDog 110 { 111 [dog eat]; 112 } 113 @end 114 115 116 117 int main() 118 { 119 Student *pStu = [Student new];//新建对象 120 pStu->dog = [Dog new];//新建狗对象 121 pStu->dog->weight = 20;//狗的体重 122 pStu->dog->curColor = ColorBlack;//狗的颜色 123 pStu->weight = 50;//学生体重 124 125 pStu->sex = SexMan;//学生性别 126 127 Date d = {1990,3,5};//学生年龄 128 pStu->birthday = d;//赋值 129 130 pStu->FavColor = ColorGreen;//学生最喜欢的颜色 131 132 pStu->name = "ZhangSan";//学生姓名 133 134 [pStu eat];//调用方法eat 135 [pStu eat];//调用方法eat 136 [pStu run];//调用方法run 137 138 [pStu print];//调用方法print 139 [pStu walkingDog];//调用方法 140 [pStu feadDog];//调用方法feadDog 141 return 0; 142 }
方法的参数
oc方法中,一个参数对应一个冒号。
- (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号. 方法名是pingfang: 包括后面的冒号。
- (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数。方法名是:SumwithNum1:andNum2:
1 #import <Foundation/Foundation.h> 2 3 /* 4 计算器类: 5 返回数值n 6 计算平方 7 计算和 8 */ 9 10 @interface JiSuanQi : NSObject 11 12 -(double) pi; 13 //方法名是 pingfang: 14 - (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号 15 //- (int) Sum:(int)a :(int)b; 16 //方法名是:SumwithNum1:andNum2: 17 - (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数 18 @end 19 20 21 @implementation JiSuanQi 22 - (double) pi 23 { 24 return 3.14; 25 } 26 - (int) pingfang:(int)num//oc方法中,一个参数对应一个冒号 27 { 28 return num * num; 29 } 30 - (int) SumwithNum1:(int)num1 andNum2:(int)num2 31 { 32 return num1 + num2; 33 } 34 @end 35 36 37 int main() 38 { 39 JiSuanQi *p = [JiSuanQi new];//新建对象 40 double d= [p pi];//调用pi方法 41 NSLog(@"%f",d); 42 int n = [p pingfang:10];//调用平方方法 43 NSLog(@"%d",n); 44 //这样写比较好理解 45 int sum = [p SumwithNum1:10 andNum2:20];//调用方法sum 46 NSLog(@"%d",sum); 47 return 0; 48 }
练习2:
1 /* 2 车 3 方法:比较车速 4 */ 5 6 // 7 @interface Car : NSObject 8 { 9 @public 10 int speed; 11 } 12 - (int) comapreSpeedWithOther:(Car *)other; 13 14 @end 15 16 @implementation Car 17 - (int) comapreSpeedWithOther:(Car *)other 18 { 19 return speed - other->speed; 20 } 21 22 @end 23 24 int main() 25 { 26 Car *p1 = [Car new]; 27 Car *p2 = [Car new]; 28 p1->speed = 200; 29 p2->speed = 300; 30 int res = [p1 comapreSpeedWithOther:p2]; 31 NSLog(@"%d",res); 32 return 0; 33 }
匿名对象的使用
[Car new]->speed = 300;//匿名对象
int main()
{
//匿名对象,不要这样写,会造成内存泄露
[Car new]->speed = 300;
//不要这样写,会造成内存泄露
[[Car new] run];
return 0;
}
Xcode文档安装
1、直接找到Xcode文件路径,把离线文件复制进去
/Applications/Xcode.app/Contents/Developer/Documentation/DocSets
2、放到硬盘某路径下
/Users/用户名/Library/Developer/Shared/Documentation/DocSets
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。