国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Objective-C學(xué)習(xí)之路-由淺入深

2019-11-09 14:44:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、Objective-C簡(jiǎn)介

Objective-C 簡(jiǎn)稱OC /Obj-c Objective 是面向?qū)ο蟮?,OC是在C語(yǔ)言的基礎(chǔ)上添加了一些新的面向?qū)ο蟮恼Z(yǔ)法,比較繁瑣的語(yǔ)法封裝的更為簡(jiǎn)單,所以在學(xué)習(xí)Objective-C之前大家必須去學(xué)習(xí)C語(yǔ)言一些基本的語(yǔ)法之類,這里我也寫了C語(yǔ)言的學(xué)習(xí)博客,去學(xué)習(xí)C語(yǔ)言,大家可以參考一下。 所以O(shè)C它是完全兼容C語(yǔ)言的,我們可以在任何的OC語(yǔ)言中寫任意的C代碼。


二、Objective-C的第一個(gè)Hello World

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0;}

學(xué)習(xí)的知識(shí)點(diǎn): 1.main函數(shù)仍然是程序的出入口, 2.使用NSLog()函數(shù)進(jìn)行打印輸出, 3.@”“表示一個(gè)字符串


三、#import 的介紹

在學(xué)習(xí)了C語(yǔ)言之后,我們知道如果想要 引用系統(tǒng)中的頭文件使用:#include<XXXX> 引用自己定義的頭文件使用:#include “xxxx” 而在OC中使用的是#import,那么引入#imPRot有什么好處呢?

首先我們分別創(chuàng)建一個(gè)a.c和b.c文件并分別自動(dòng)生成一個(gè)a.h和b.h的頭文件: a.h中添加#include “b.h”

#ifndef a_h#define a_h#include <stdio.h>#include "b.h"#endif /* a_h */

b.h中添加#include “a.h”

#ifndef b_h#define b_h#include <stdio.h>#include "a.h"#endif /* b_h */

這種現(xiàn)象叫做重復(fù)包含,然后: 這里寫圖片描述 這里寫圖片描述 發(fā)現(xiàn)我們的include會(huì)報(bào)錯(cuò),然后我們改成import: 這里寫圖片描述 這里寫圖片描述 會(huì)發(fā)現(xiàn)我們的報(bào)錯(cuò)就消失了,這到底是為了什么呢? 首先我們?cè)赼.h與b.h中都是:

//#ifndef b_h//#define b_h//#endif /* b_h */

ifndef:表示如果不存在就引入b.h文件,存在就啥都不干 define:表示默認(rèn)引入b.h文件 endif:結(jié)束語(yǔ),否則不引入b.h

而我們的import: #import指令是#include指令的增強(qiáng)版,能實(shí)現(xiàn)include的功能

.

列表內(nèi)容#include指令單獨(dú)使用,可能會(huì)造成重復(fù)包含,要防止重復(fù)包含,用預(yù)編譯指令配合才能防止重復(fù)包含。#import增強(qiáng)的點(diǎn)就是單獨(dú)使用這個(gè)指令的時(shí)候,不會(huì)造成重復(fù)包含,同一個(gè)文件中,無(wú)論被#import多少次,在預(yù)編譯的時(shí)候只會(huì)包含一次。#import指令的底層會(huì)自動(dòng)判斷這個(gè)文件是否包含,沒(méi)有包含的時(shí)候才會(huì)包含#import指令包含的時(shí)候和#include一樣,也分為#import “” ,例如我們例子中的#import “a.h”
文件搜索順序:先從當(dāng)前文件夾下-->編譯器的文件夾下-->系統(tǒng)文件夾-->查找失敗 #import <>,例如我們例子中的#import 

四、NSLog()、NSString、NS前綴介紹、@符號(hào)介紹:

1、NSLog():C語(yǔ)言中的printf中的增強(qiáng)版 作用:在控制臺(tái)打印數(shù)據(jù) 這里寫圖片描述 好處:打印清晰,不用輸入/n,會(huì)自動(dòng)換行

2、NSString():OC中特意設(shè)置了NSString指針去儲(chǔ)存字符串,使用NSString指針變量可以保存1個(gè)字符串?dāng)?shù)據(jù)的地址。

注意: 一、OC字符串OC字符串必須以@開(kāi)頭 二、@必須寫在”“前面 三、在OC中打印字符串使用%@ 四、 NSString只能儲(chǔ)存字符串?dāng)?shù)據(jù)地址

例如:

這里寫圖片描述

與C語(yǔ)言相比增加了一個(gè)@。

3、NS前綴():

前綴:在OC應(yīng)用中所有的類名都必須是全局唯一的,由于很多不同的框架會(huì)有一些相似的功能,所有在名字上也會(huì)有重復(fù)的可能,所以蘋果官方文檔規(guī)定類名需要2-3個(gè)字母作為前綴。 類前綴: 蘋果官方建議兩個(gè)字母作為前綴的類名是為官方的庫(kù)和框架準(zhǔn)備的,而對(duì)于作為第三方開(kāi)發(fā)者的我們,官方建議使用3個(gè)或者更多的字母作為前綴去命名我們的類。 NS來(lái)自于NeXTStep 的一個(gè)軟件 NeXT Software.OC中不支持命名空間,NS是為了避免命名沖突而給的前綴,看到NS前綴就是知道是Cocoa中的系統(tǒng)類的名稱

4、@符號(hào)介紹:在OC中@符號(hào)有兩種含義:

@”“:代表OC語(yǔ)言中的一個(gè)字符串,例如:@”你好世界”@直接接英文:代表OC語(yǔ)言中的一個(gè)關(guān)鍵字,例如:@interface

五、在OC中調(diào)用C代碼:

這里寫圖片描述 以上我們是在OC中直接寫C代碼,現(xiàn)在我們來(lái)看下: 創(chuàng)建一個(gè)Show.c:

#include "Show.h"void showTest(){ printf("我是C語(yǔ)言寫的,何人敢調(diào)用我啊/n");}

Show.h:

#ifndef Show_h#define Show_h#include <stdio.h>extern void showTest();#endif /* Show_h */

main.m: 這里寫圖片描述 我們?cè)趍ain中調(diào)用新創(chuàng)建的.c文件代碼看到也是可以調(diào)用的。


六、OC中的布爾類型:

這里寫圖片描述 我們知道C語(yǔ)言中是沒(méi)有布爾類型的,使用int類型去表示真假,2而OC提供了BOOL和Boolean去表示真假。


七、類的聲明和實(shí)現(xiàn)

類:.h文件為類的聲明文件,用于聲明成員變量、方法。類的聲明使用關(guān)鍵字@interface@end

注意:.h中的方法只是做一個(gè)聲明,并不對(duì)方法進(jìn)行實(shí)現(xiàn),也就是說(shuō),只是說(shuō)明一個(gè)方法名,方法的返回值類型、方法接受的參數(shù)類型而已,并不會(huì)編寫方法內(nèi)部的代碼

.m:類的實(shí)現(xiàn)文件,用于實(shí)現(xiàn).h中聲明的方法,類的實(shí)現(xiàn)使用關(guān)鍵字@implementation@end

方法:方法的聲明和實(shí)現(xiàn),都必須以+或者-開(kāi)頭 +表示類方法(靜態(tài)方法) -表示對(duì)象方法(動(dòng)態(tài)方法)

成員變量:成員變量作用域有3中: 1.@public 全局都可以訪問(wèn) 2.@protected 只能在類內(nèi)部和子類訪問(wèn) 3. @private 只能在類內(nèi)部訪問(wèn)

這里寫圖片描述

這里寫圖片描述 以上我們可以看到: 1、類的聲明:@interface 類名:父類類名(NSObject是所有類的父類) 2、類的實(shí)現(xiàn):@implementaion 需要實(shí)現(xiàn)的類名

這里寫圖片描述

這里寫圖片描述


八、#pragma mark指令的使用,函數(shù)與對(duì)象方法的區(qū)別,常見(jiàn)注意點(diǎn)

這里寫圖片描述 當(dāng)我們一個(gè)類中有大量代碼,為了容易區(qū)分我們可以使用 #pragma mark 需要備注的信息

函數(shù)與對(duì)象方法的區(qū)別: 1.函數(shù)使用的時(shí)候直接調(diào)用,對(duì)象方法需要?jiǎng)?chuàng)建對(duì)象才能調(diào)用 2.函數(shù)不能放在聲明中,對(duì)象方法的實(shí)現(xiàn)和聲明只能方法在關(guān)鍵字練 3.函數(shù)不可以訪問(wèn)對(duì)象中的成員變量 4.對(duì)象方法歸類所有

常見(jiàn)注意點(diǎn): 1.實(shí)現(xiàn)和聲明必須一一對(duì)應(yīng) 2.@implementation、@interface、@end不能嵌套包含 3.成員變量必須寫在{}里面,方法必須寫在{}的外面 4.在聲明時(shí)不能對(duì)類的成員變量初始化,請(qǐng)注意成員變量不能脫離對(duì)象而獨(dú)立存在。 5.成員變量和方法不能使用static等關(guān)鍵字修飾,主要是不要和C語(yǔ)言混淆 6.類的實(shí)現(xiàn)可以寫在main函數(shù)后面,在使用之前只要有聲明就可以


九、NSString類簡(jiǎn)單介紹及用法

1.四種創(chuàng)建字符串的方式:

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { //1. NSString *name=@"張三"; NSLog(@"%@",name); //2. NSString *string = [NSString new]; string=@"李四"; NSLog(@"%@",string); //3. NSString *string2= [[NSString alloc] initWithFormat:name]; NSLog(@"%@",string2); //4. NSString *string3=[NSString stringWithFormat:@"圖片 xxx %02d- %02d",0x13,10]; NSLog(@"%@",string3); } return 0;}

1.NSString字符串長(zhǎng)度的計(jì)算方式:

NSString *str=@"abcdefg";NSLog(@"str的長(zhǎng)度為:%ld",[str length]);//7

十、類方法介紹

前面我們說(shuō)過(guò)用+修飾的代表類方法,例如: Person.h:

@interface Person : NSObject{ @public NSString *_name;}+ (void) show:(NSString *)name;- (void) showObj;@end

Person.m:

#import <Foundation/Foundation.h>#import "Person.h"@implementation Person+ (void) show:(NSString *)name{ NSLog(@"name=%@",name);}- (void) showObj{ NSLog(@"name=%@",_name);}@end

main.m:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *person=[Person new]; person->_name=@"我是通過(guò)對(duì)象來(lái)調(diào)用"; [person showObj]; [Person show:@"我是通過(guò)類調(diào)用的"]; } return 0;}

這里寫圖片描述

這里寫圖片描述


十一、self的用法

Student.h

@interface Student : NSObject- (void) study;- (void) eat;@end

Student.m

#import <Foundation/Foundation.h>#import "Student.h"@implementation Student- (void) study{ NSLog(@"我在學(xué)習(xí)啊。。"); [self eat];}- (void) eat{ NSLog(@"我在吃啊。。");}@end

main.m

#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]) { @autoreleasepool { Student *s=[Student new]; [s study]; } return 0;}

這里寫圖片描述


十二、description與Super的使用

Worker.h

@interface Worker : NSObject{ @public NSString *_name; int _num;}- (void)setName:(NSString *)name;- (NSString *)name;- (void)setNum:(int)num;- (int)num;@end

Worker.m

#import <Foundation/Foundation.h>#import "Worker.h"@implementation Worker/**- (NSString *)description{ return _name;}*/- (void)setName:(NSString *)name{ _name=name;}- (NSString *)name{ return _name;}- (void)setNum:(int)num{ _num=num;}- (int)num{ return _num;}@end

main.m

#import <Foundation/Foundation.h>#import "Worker.h"int main(int argc, const char * argv[]) { @autoreleasepool { Worker *worker=[Worker new]; worker->_name=@"張三"; NSLog(@"worker:%@",worker); } return 0;}

運(yùn)行結(jié)果: 這里寫圖片描述

我們看到Worker.m中我們有一個(gè)description的方法,我們打開(kāi)它然后運(yùn)行: 這里寫圖片描述 這時(shí)候可以看到原本輸出的地址值變成了我們description 方法中的值輸出了 (NSString*) description 1.所有的類,都有description方法 2.作用:賦值NSLog輸出

二、Super應(yīng)用場(chǎng)景: 1.用在對(duì)象的方法中          調(diào)用對(duì)象父類的對(duì)象方法 2.用在類方法中          調(diào)用類的父類的類方法


十三、成員變量修飾符的介紹

成員變量修飾符: 1.@public :(公開(kāi))只要導(dǎo)入頭文件,任何位置都可以使用 2.@protected:(半公開(kāi))可以在本類和子類當(dāng)中進(jìn)行訪問(wèn)(new出來(lái)的對(duì)象是調(diào)用不到的) 3.@private:(私有)只能在本類當(dāng)中進(jìn)行訪問(wèn),子類無(wú)法進(jìn)行訪問(wèn)賦值      @private修飾的成員變量子類不能直接訪問(wèn),但是子類因?yàn)槔^承了這個(gè)@private修飾的成員變量,所以子類也不能重新定義這個(gè)成員變量。 4.@package:在同一框架內(nèi),可以直接訪問(wèn)


十四、多態(tài)的介紹

為什么父類可以訪問(wèn)子類繼承自父類的方法,但是無(wú)法訪問(wèn)子類獨(dú)有的方法? 1.編譯器編譯時(shí): 編譯器在編譯時(shí),只檢查指針變量的類型,確定該指針變量類型里面有下面調(diào)用的方法,如果有該方法,編譯器就認(rèn)為,是正確的,可以編譯通過(guò)。 2.運(yùn)行時(shí),會(huì)動(dòng)態(tài)監(jiān)測(cè)對(duì)象的真實(shí)類型,然后,調(diào)用對(duì)象自己的方法

父類指針,指向子類對(duì)象的這種形式,叫做多態(tài)。 當(dāng)父類想要訪問(wèn)子類特有的方法時(shí),強(qiáng)制類型轉(zhuǎn)換。


十五、類對(duì)象

1.類代碼存儲(chǔ)在代碼區(qū)。 2.當(dāng)程序運(yùn)行時(shí),類第一次被訪問(wèn),加載到代碼區(qū),這個(gè)加載類的過(guò)程稱為類加載 3.類一旦加載到代碼區(qū)之后,就一直不會(huì)釋放,直到程序結(jié)束的時(shí)候才會(huì)被釋放 4.任何數(shù)據(jù)存儲(chǔ)于代碼區(qū),都有數(shù)據(jù)類型,那么類的數(shù)據(jù)類型什么呢?如何獲取呢? main.m

#import <Foundation/Foundation.h>#import "Teacher.h"int main(int argc, const char * argv[]) { @autoreleasepool { Teacher *teacher=[Teacher new]; //第一種獲取類對(duì)象的方法 Class c1=[teacher class]; //第二種獲取類對(duì)象方法 Class c2=[Teacher class]; // c2= [Teacher new]; //[(Teacher*)c2 test]; [c2 show]; // c2->_num; NSLog(@"c1=%p,c2=%p",c1,c2); } return 0;}

總結(jié): 1.類對(duì)象可以調(diào)用類方法 2.類對(duì)象可以創(chuàng)建出一個(gè)對(duì)象 3.不能用類對(duì)象調(diào)用方法 4.不能用類對(duì)象給成員變量賦值


十六、SEL的使用:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *per=[Person new]; //test為對(duì)象中的方法, //如果對(duì)象per中沒(méi)有test方法就會(huì)報(bào)錯(cuò) SEL s=@selector(test); //調(diào)用方式:[對(duì)象名 performSelector:SEL的變量名] [per performSelector:s]; } return 0;}

十七、點(diǎn)語(yǔ)法的使用

我們知道OC是面向?qū)ο蟮?,所以必然有三大特性:封裝,多態(tài),繼承,封裝就是將我們的屬性給封裝起來(lái)使用set和get去得到屬性 Person.h

@interface Person : NSObject{ @public NSString *_name; int _age; int _sex;}- (void)setName:(NSString*)name;- (NSString*)name;- (void)setAge:(int)age;- (int)age;- (void)setSex:(int)sex;- (int)sex;@end

Person.m

#import <Foundation/Foundation.h>#import "Person.h"@implementation Person- (void)setName:(NSString*)name{ _name=name;}- (NSString*)name{ return _name;}- (void)setAge:(int)age{ _age=age;}- (int)age{ return _age;}- (void)setSex:(int)sex{ _sex=sex;}- (int)sex{ return _sex;}@end

main.m

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; p.name=@"張三"; p.age=10; p.sex=1; NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}

點(diǎn)語(yǔ)法的本質(zhì)就是set和get方法的調(diào)用


十八、@property、@synthesize關(guān)鍵字的使用

@property的作用:能夠自動(dòng)生成get和set方法的聲明, 定義方式:@property 成員變量類型 成員變量名(去掉下劃線) 在XCode4.4版本之前需要配合@synthesize使用

Person.h

@interface Person : NSObject{@public NSString *_name; NSString *name; int _age; int _sex;}/**- (void)setName:(NSString*)name;- (NSString*)name;- (void)setAge:(int)age;- (int)age;- (void)setSex:(int)sex;- (int)sex; */@property NSString *name;@property int age,sex;@end

Person.m

#import <Foundation/Foundation.h>#import "Person.h"@implementation Person@synthesize name,age,sex;@end

main.m:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; //這步能夠調(diào)用,證明@property生成了set和get方法的聲明 p.name=@"張三"; p.age=10; p.sex=1; //證明@synthesize生成了set和get的實(shí)現(xiàn) NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}

這里寫圖片描述

XCode4.4之后:

Person.h

@interface Person : NSObject@property NSString *name;@property int age;@property int sex;@end

Person.m

#import <Foundation/Foundation.h>#import "Person.h"@implementation Person@end

main.m:

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p=[Person new]; //這步能夠調(diào)用,證明@property生成了set和get方法的聲明 p.name=@"張三"; p.age=10; p.sex=1; //證明@synthesize生成了set和get的實(shí)現(xiàn) NSLog(@"name=%@,age=%d,sex=%d",p.name,p.age,p.sex); } return 0;}

這里寫圖片描述


十九、了解動(dòng)態(tài)類型和靜態(tài)類型:

動(dòng)態(tài)類型:程序知道執(zhí)行時(shí)才能確定所屬類,多態(tài)。Animal *anl=[Cat new]; 靜態(tài)類型:將一個(gè)變量定義為特定類對(duì)象時(shí),使用的是靜態(tài)形態(tài)。Animal *anl[Animal new];


二十、id類型的使用

今天還有事,先寫到這,持續(xù)更新


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 进贤县| 虞城县| 吴旗县| 靖远县| 莱阳市| 涿州市| 吴堡县| 嘉兴市| 延长县| 淳化县| 深圳市| 峨边| 安泽县| 咸丰县| 黑水县| 上林县| 玉田县| 伊通| 道孚县| 无为县| 清苑县| 青浦区| 凤冈县| 灌云县| 和静县| 焦作市| 定西市| 南汇区| 富阳市| 株洲县| 胶州市| 易门县| 兰州市| 宣恩县| 长汀县| 体育| 建德市| 娄底市| 抚顺县| 南丰县| 江永县|