oc類的聲明和定義的常見錯誤
1、只有類的聲明,沒有類的實(shí)現(xiàn)
2、漏了@end
3、@interface和@implementation嵌套,也就是@interface或者@implementation和@end必須成對出現(xiàn)!兩者中間不能嵌套任何別的。
4、成員變量沒有寫在括號里面
5、方法的聲明寫在了聲明的大括號里面,或者方法的實(shí)現(xiàn)寫在了聲明里。這都是不對的。
6、忘記了:NSObject
7、想直接修改類成員變量,但是沒有設(shè)置為@public
8、類的聲明里的實(shí)例變量,不能在聲明的時候初始化。
9、不能把成員變量當(dāng)做c語言的變量,比如加static,不對!類的聲明里只能寫類的成員變量名
10、記住:方法是方法,函數(shù)是函數(shù),也不能給方法加比如static。沒有這個東西
11、成員變量不能在{}中進(jìn)行初始化、默認(rèn)不能被直接拿出去訪問
12、方法不能當(dāng)做函數(shù)一樣調(diào)用或者聲明,對象方法只能是對象來調(diào)用
13、類的實(shí)現(xiàn)可寫在main函數(shù)的后面,只要在類的聲明后面就行了
14、記住:oc里對象方法名包含冒號,oc不允許方法名一樣,-或者+不是方法名
OC方法和函數(shù)的區(qū)別
1、OC方法只能聲明在@interface和@end之間,只能實(shí)現(xiàn)在@implementation和@end之間。也就是說OC方法不能獨(dú)立于類存在
2、C函數(shù)不屬于類,跟類沒有聯(lián)系,C函數(shù)只歸定義函數(shù)的文件所有
3、C函數(shù)不能訪問OC對象的成員
4、低級錯誤:方法有聲明,但是實(shí)現(xiàn)的時候?qū)懗闪撕瘮?shù)
5、oc的函數(shù)可以寫在文件的任何位置(除@interface和@end之間除外,可以寫在類的實(shí)現(xiàn)里),歸文件所有
OC的方法使用注意
1、方法只有聲明,沒有實(shí)現(xiàn)(這是經(jīng)典錯誤)
2、方法沒有聲明,只有實(shí)現(xiàn)(編譯器警告,但是能調(diào)用,OC的弱語法)
3、編譯的時候:訪問沒有的成員變量直接報錯,訪問沒有的方法,只是警告,弱語法
4、沒有@interface,只有@implementation,也能成功定義一個類
@implementation Car : NSObject{ @public int wheels; // 輪子 int speed; // 時速}//方法就不用聲明了,直接在類的實(shí)現(xiàn)里寫定義即可- (void) run{ NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);}@end
類里涉及到聲明性別,時間等
如果用布爾類型定義性別,不太好,容易讓外人搞混,不利于團(tuán)隊(duì)的代碼共享。如果屬性只有幾個固定的取值,那么最好用枚舉。
對于年月日的聲明不要寫成這樣,很傻,很累,
//int year; //int month; //int day;
使用結(jié)構(gòu)體
Date birthday;//生日結(jié)構(gòu) double weight;//體重 Color favourColor;//最喜歡的顏色枚舉
Sex sex;//性別枚舉
程序代碼如下:
1 /* 設(shè)計(jì)一個學(xué)生類 2 類名:學(xué)生 3 成員變量:姓名,性別,生日,體重,喜歡的顏色,每個學(xué)生都養(yǎng)一條狗(狗也是一個對象) 4 方法:吃飯,鍛煉,遛狗(讓狗run),喂狗(讓狗eat) 5 */ 6 #import <Foundation/Foundation.h> 7 typedef enum 8 { 9 //標(biāo)準(zhǔn)寫法,枚舉常量名字含有枚舉類型的名字,一目了然,容易閱讀 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 //狗類實(shí)現(xiàn) 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 //學(xué)生類聲明 53 @interface Student : NSObject 54 { 55 @public 56 char *name;//姓名 57 //如果用布爾類型定義性別,不太好,容易讓外人搞混,不利于團(tuán)隊(duì)的代碼共享,BOOL sex;要么男,要么女,YES or NO 58 //如果屬性只有幾個固定的取值,那么最好用枚舉 59 Sex sex;//性別枚舉 60 //不要寫成這樣,很傻,很累,使用結(jié)構(gòu)體 61 //int year; 62 //int month; 63 //int day; 64 Date birthday;//生日結(jié)構(gòu) 65 double weight;//體重 66 Color favourColor;//最喜歡的顏色枚舉 67 //每個學(xué)生都養(yǎng)一條狗,必須用指針,oc的對象都是用指針來操作的! 68 Dog *dog; 69 } 70 //類的聲明里,任何數(shù)據(jù)類型都是可以聲明的,對象方法的聲明,不在花括號里,但是在類的聲明范圍內(nèi)寫 71 - (void) eat; 72 - (void) exercise; 73 - (void) PRint;//打印全部信息 74 - (void) walkTheDog;//遛狗 75 - (void) feedTheDog;//喂狗 76 @end 77 //設(shè)計(jì)到這一步,類還沒完成,如果沒有類的實(shí)現(xiàn),編譯沒事,但是鏈接會報錯。必須有類的實(shí)現(xiàn) 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 //調(diào)用狗類對象的run方法,這是面向?qū)ο笏季S的體現(xiàn) 97 [dog run]; 98 99 }100 - (void) feedTheDog101 {102 [dog eat];103 }104 @end105 106 int main()107 {108 Student *student = [Student new];109 student->weight = 50; //體重110 student->sex = SexMan; //性別 111 //下面的寫法不對,只有在定義結(jié)構(gòu)體變量的同時初始化是合法的,而現(xiàn)在因?yàn)橐呀?jīng)存在了結(jié)構(gòu)體的變量(類聲明里),不可以用下面的方法再次直接去初始化,否則報錯112 //student->birthday = {1990, 11, 11};//生日113 114 //可以用下面的方法,重定義生日結(jié)構(gòu)新的變量,同時初始化,再賦值給birthday115 //Date date = {1990, 11, 11};116 //student->birthday = date;117 118 //或者使用下面的方法,使用指針去訪問結(jié)構(gòu)體變量birthday,再使用結(jié)構(gòu)體變量訪問里面的結(jié)構(gòu)體成員,去賦值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 //學(xué)生類內(nèi)部的狗的指針成員去指向一個狗類的一個對象(也就是一條狗)128 Dog *d = [Dog new];//創(chuàng)建狗類的一個對象,用d指向129 d->hairColor = ColorWright;130 d->weight = 20;//訪問狗類的成員131 student->dog = d;//把這個狗類的對象賦值給學(xué)生類里狗類的指針,被該指針指向,學(xué)生就可以操作狗的對象了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 的代碼提示功能的關(guān)閉和開啟


再次熟悉下,oc 里方法名,方法類型,返回值類型,方法參數(shù)的部分


開發(fā) IOS 到一定程度,要習(xí)慣看蘋果的官方文檔

oc 里的數(shù)據(jù)類型
Object-c提供基本數(shù)據(jù)類型:int 、float 、double 、char
int:
八進(jìn)制 ,整型第一位為 0, NSLog 的格式符為: %o ,顯示的八進(jìn)制不帶前導(dǎo) 0
十六進(jìn)制 ,以 0x 開頭的整型,NSLog 的格式符為: 若(%X 或%#X) 顯示的十六進(jìn)制用大寫
%#o 顯示的八進(jìn)制帶前導(dǎo)0
%x 顯示的十六進(jìn)制不帶前導(dǎo) 0x
%#x 顯示的十六進(jìn)制帶前導(dǎo)0x
float:
NSLog 的格式符:%f
NSLog 的格式符:%e 科學(xué)計(jì)數(shù)法顯示值
NSLog 的格式符:%g 指數(shù)的值小于-4 大于 5,采用%e,否則采用%f
十六進(jìn)制的浮點(diǎn)常量包含前導(dǎo) 0x 或 0X,后面緊跟一個或多個十進(jìn)制或十六進(jìn)制數(shù)字,再后是p 或 P,最后,是可以帶符號的二進(jìn)制指數(shù)。例:0x0.3p10 表示的值為 3/16*2^10
注:若無特殊說明,Object-c 將所有的浮點(diǎn)常量看做 double 值,要顯示 double 值可使用和 float一樣的格式符。
char:
NSLog 的格式符:%c
long double 常量寫成尾部帶有字母 l 或者 L 的浮點(diǎn)常量。1.234e+7L

注:id 類型可以通過類型轉(zhuǎn)化符可以將一般的id 類型的對象轉(zhuǎn)換成特定的對象。
_Bool ;處理 Boolean(即 0 或 1)
_Complex;處理復(fù)數(shù)
_Imaginary;處理抽象數(shù)字
鍵盤輸入:
int number;scanf("%i",&number);
實(shí)例變量的初始化值默認(rèn)為 0
實(shí)例變量作用域的指令:
@protected;實(shí)例變量可被該類及任何子類中定義的方法直接訪問(默認(rèn)的情況) 。
@private;實(shí)例變量可被定義在該類的方法直接訪問,不能被子類定義的方法直接訪問。
@public;實(shí)例變量可被該類中定義的方法直接訪問,也可被其他類或模塊中定義的方法訪問。使得其他方法或函數(shù)可以通過(->)來訪問實(shí)例變量(不推薦用) 。
@package;對于 64 位圖像,可以在實(shí)現(xiàn)該類的圖像的任何地方訪問這個實(shí)例變量。
在類中定義靜態(tài)變量和 C 一樣
voaltile說明符和const 正好相反,明確告訴編譯器,指定類型變量的值會改變。(I/O端口)
比如要將輸出端口的地址存儲在 outPort 的變量中。
volatile char *outPort;*outPort = 'O';*outPort = 'N';
這樣就可以避免編譯器將第一個賦值語句從程序中刪除 。
枚舉數(shù)據(jù)類型、typedef 語法以及數(shù)據(jù)類型的轉(zhuǎn)換和 C 也是一樣。
新聞熱點(diǎn)
疑難解答
圖片精選