在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
oc类的声明和定义的常见错误 1、只有类的声明,没有类的实现 2、漏了@end 3、@interface和@implementation嵌套,也就是@interface或者@implementation和@end必须成对出现!两者中间不能嵌套任何别的。 4、成员变量没有写在括号里面 5、方法的声明写在了声明的大括号里面,或者方法的实现写在了声明里。这都是不对的。 6、忘记了:NSObject 7、想直接修改类成员变量,但是没有设置为@public 8、类的声明里的实例变量,不能在声明的时候初始化。 9、不能把成员变量当做c语言的变量,比如加static,不对!类的声明里只能写类的成员变量名 10、记住:方法是方法,函数是函数,也不能给方法加比如static。没有这个东西 11、成员变量不能在{}中进行初始化、默认不能被直接拿出去访问 12、方法不能当做函数一样调用或者声明,对象方法只能是对象来调用 13、类的实现可写在main函数的后面,只要在类的声明后面就行了 14、记住:oc里对象方法名包含冒号,oc不允许方法名一样,-或者+不是方法名 OC方法和函数的区别 1、OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在 2、C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有 3、C函数不能访问OC对象的成员 4、低级错误:方法有声明,但是实现的时候写成了函数 5、oc的函数可以写在文件的任何位置(除@interface和@end之间除外,可以写在类的实现里),归文件所有 OC的方法使用注意 1、方法只有声明,没有实现(这是经典错误) 2、方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法) 3、编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告,弱语法 4、没有@interface,只有@implementation,也能成功定义一个类 @implementation Car : NSObject { @public int wheels; // 轮子 int speed; // 时速 } //方法就不用声明了,直接在类的实现里写定义即可 - (void) run { NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed); } @end 类里涉及到声明性别,时间等 如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享。如果属性只有几个固定的取值,那么最好用枚举。 对于年月日的声明不要写成这样,很傻,很累, //int year; //int month; //int day; 使用结构体 Date birthday;//生日结构 double weight;//体重 Color favourColor;//最喜欢的颜色枚举 Sex sex;//性别枚举 程序代码如下: 1 /* 设计一个学生类 2 类名:学生 3 成员变量:姓名,性别,生日,体重,喜欢的颜色,每个学生都养一条狗(狗也是一个对象) 4 方法:吃饭,锻炼,遛狗(让狗run),喂狗(让狗eat) 5 */ 6 #import <Foundation/Foundation.h> 7 typedef enum 8 { 9 //标准写法,枚举常量名字含有枚举类型的名字,一目了然,容易阅读 10 SexMan,//0 11 SexWoman//1 12 } Sex; 13 14 typedef struct{ 15 int year; 16 int month; 17 int day; 18 } Date; 19 20 typedef enum{ 21 ColorBlack,//0 22 ColorWright,//1 23 ColorRed//2 24 } Color; 25 26 //狗类声明 27 //成员变量:体重,毛色 28 //方法:吃东西,跑 29 @interface Dog : NSObject 30 { 31 @public 32 double hairColor;//毛色 33 double weight;//体重 34 } 35 - (void) eat; 36 - (void) run; 37 @end 38 //狗类实现 39 @implementation Dog 40 - (void) eat 41 { 42 43 weight += 1; 44 NSLog(@"喂狗饭,体重是%f", weight); 45 } 46 - (void) run 47 { 48 weight -= 1; 49 NSLog(@"遛狗后,体重是%f", weight); 50 } 51 @end 52 //学生类声明 53 @interface Student : NSObject 54 { 55 @public 56 char *name;//姓名 57 //如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享,BOOL sex;要么男,要么女,YES or NO 58 //如果属性只有几个固定的取值,那么最好用枚举 59 Sex sex;//性别枚举 60 //不要写成这样,很傻,很累,使用结构体 61 //int year; 62 //int month; 63 //int day; 64 Date birthday;//生日结构 65 double weight;//体重 66 Color favourColor;//最喜欢的颜色枚举 67 //每个学生都养一条狗,必须用指针,oc的对象都是用指针来操作的! 68 Dog *dog; 69 } 70 //类的声明里,任何数据类型都是可以声明的,对象方法的声明,不在花括号里,但是在类的声明范围内写 71 - (void) eat; 72 - (void) exercise; 73 - (void) print;//打印全部信息 74 - (void) walkTheDog;//遛狗 75 - (void) feedTheDog;//喂狗 76 @end 77 //设计到这一步,类还没完成,如果没有类的实现,编译没事,但是链接会报错。必须有类的实现 78 @implementation Student 79 - (void) eat 80 { 81 82 weight += 1; //每吃一顿,体重增加一公斤 83 NSLog(@"吃完饭,体重是%f", weight); 84 } 85 - (void) exercise 86 { 87 weight -= 1; //每次锻炼,体重减少一公斤 88 NSLog(@"锻炼后,体重是%f", weight); 89 } 90 - (void) print 91 { 92 NSLog(@"性别 = %d, 喜欢的颜色 = %d, 姓名= %s, 生日 = %d-%d-%d", sex, favourColor, name, birthday.year, birthday.month, birthday.day); 93 } 94 - (void) walkTheDog 95 { 96 //调用狗类对象的run方法,这是面向对象思维的体现 97 [dog run]; 98 99 } 100 - (void) feedTheDog 101 { 102 [dog eat]; 103 } 104 @end 105 106 int main() 107 { 108 Student *student = [Student new]; 109 student->weight = 50; //体重 110 student->sex = SexMan; //性别 111 //下面的写法不对,只有在定义结构体变量的同时初始化是合法的,而现在因为已经存在了结构体的变量(类声明里),不可以用下面的方法再次直接去初始化,否则报错 112 //student->birthday = {1990, 11, 11};//生日 113 114 //可以用下面的方法,重定义生日结构新的变量,同时初始化,再赋值给birthday 115 //Date date = {1990, 11, 11}; 116 //student->birthday = date; 117 118 //或者使用下面的方法,使用指针去访问结构体变量birthday,再使用结构体变量访问里面的结构体成员,去赋值 119 student->birthday.year = 1990; 120 student->birthday.month = 5; 121 student->birthday.day = 28; 122 123 //最喜欢的颜色 124 student->favourColor = ColorBlack; 125 //姓名 126 student->name = "dashuai"; 127 //学生类内部的狗的指针成员去指向一个狗类的一个对象(也就是一条狗) 128 Dog *d = [Dog new];//创建狗类的一个对象,用d指向 129 d->hairColor = ColorWright; 130 d->weight = 20;//访问狗类的成员 131 student->dog = d;//把这个狗类的对象赋值给学生类里狗类的指针,被该指针指向,学生就可以操作狗的对象了 132 [student walkTheDog]; 133 [student feedTheDog]; 134 [student print]; 135 136 // [student eat]; 137 // [student eat]; 138 // [student exercise]; 139 // [student exercise]; 140 return 0; 141 } Xcode 的代码提示功能的关闭和开启 再次熟悉下,oc 里方法名,方法类型,返回值类型,方法参数的部分
开发 IOS 到一定程度,要习惯看苹果的官方文档
oc 里的数据类型 Object-c提供基本数据类型:int 、float 、double 、char
int: 八进制 ,整型第一位为 0, NSLog 的格式符为: %o ,显示的八进制不带前导 0 十六进制 ,以 0x 开头的整型,NSLog 的格式符为: 若(%X 或%#X) 显示的十六进制用大写 %#o 显示的八进制带前导0 %x 显示的十六进制不带前导 0x %#x 显示的十六进制带前导0x
float: 十六进制的浮点常量包含前导 0x 或 0X,后面紧跟一个或多个十进制或十六进制数字,再后是p 或 P,最后,是可以带符号的二进制指数。例:0x0.3p10 表示的值为 3/16*2^10 注:若无特殊说明,Object-c 将所有的浮点常量看做 double 值,要显示 double 值可使用和 float一样的格式符。
char: NSLog 的格式符:%c long double 常量写成尾部带有字母 l 或者 L 的浮点常量。1.234e+7L
_Bool ;处理 Boolean(即 0 或 1) _Complex;处理复数
键盘输入: int number; scanf("%i",&number);
实例变量的初始化值默认为 0
实例变量作用域的指令: @protected;实例变量可被该类及任何子类中定义的方法直接访问(默认的情况) 。 @private;实例变量可被定义在该类的方法直接访问,不能被子类定义的方法直接访问。 @public;实例变量可被该类中定义的方法直接访问,也可被其他类或模块中定义的方法访问。使得其他方法或函数可以通过(->)来访问实例变量(不推荐用) 。 @package;对于 64 位图像,可以在实现该类的图像的任何地方访问这个实例变量。
在类中定义静态变量和 C 一样 voaltile说明符和const 正好相反,明确告诉编译器,指定类型变量的值会改变。(I/O端口) 比如要将输出端口的地址存储在 outPort 的变量中。 volatile char *outPort; *outPort = 'O'; *outPort = 'N'; 这样就可以避免编译器将第一个赋值语句从程序中删除 。 枚举数据类型、typedef 语法以及数据类型的转换和 C 也是一样。 辛苦的劳动,转载请注明出处,谢谢……
http://www.cnblogs.com/kubixuesheng/p/4307783.html
|
请发表评论