IOS暑假小學(xué)期實(shí)訓(xùn) 第1天 總結(jié) “ OC基本語法”&&“方法格式”

2016/07/09

OC基本語法

//

// ?main.m

// ?OC基本語法

//

// ?Created by lanou on 16/7/9.

// ?Copyright ? 2016年yhy. All rights reserved.

//

#import

int main(int argc, const char * argv[]) {

@autoreleasepool {

// insert code here...

NSLog(@"Hello, World!");

//整型

NSInteger a = 10;

NSLog(@"a = %ld",a);

//浮點(diǎn)型

CGFloat b = 2.3;

NSLog(@"b = %.2f",b);

//布爾類型

BOOL flag = YES;

//字符串

NSString *str = @"a淮南師范de";

NSLog(@"str=%@",str);

NSLog(@"str的長(zhǎng)度=%ld",str.length);

//字符串相等

if([str isEqualToString:@"a淮南師范de"])

{

NSLog(@"是的");

}

//前綴相等

if ([str hasPrefix:@"a"])

{

NSLog(@"前綴等于a");

}

//后綴相等

if ([str hasSuffix:@"師范de"])

{

NSLog(@"后綴等于師范");

}

//格式化創(chuàng)建字符串

NSString *str1 = [NSString ?stringWithFormat:@"%@+++++",str];

NSLog(@"str1 = %@",str1);

}

return 0;

}

//

// ?main.m

// ?oc基礎(chǔ)語法2

//

// ?Created by lanou on 16/7/9.

// ?Copyright ? 2016年yhy. All rights reserved.

//

#import

int main(int argc, const char * argv[]) {

@autoreleasepool

{

//數(shù)組(NSArray/NSMutableArray)

//不可變數(shù)組

NSArray *array1 =@[@"a",@"b",@"c",@"d"];

//創(chuàng)建

NSLog(@"array1 = %@",array1);

//數(shù)組元素個(gè)數(shù).count

NSLog(@"count = %ld",array1.count);

//通過下標(biāo)訪問數(shù)組里面的元素

NSString *str = array1[0];

NSLog(@"str = %@",str);

//可變數(shù)組

NSMutableArray *mutableArray= [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",nil];

NSLog(@"mutableArray = %@",mutableArray);

//元素個(gè)數(shù):count

//添加個(gè)數(shù):addobject

[mutableArray addObject:@"5"];

NSLog(@"已添加------%@",mutableArray);

//移除元素:removeobject

[mutableArray removeObject:@"3"];

NSLog(@"已移除----%@",mutableArray);

//字典

// ? ? ? ?(NSDictionary,NSMutableArrayDictionary)

NSDictionary *dict = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};

NSLog(@"dict = %@",dict);

NSString *string = [dict objectForKey:@"key1"];

NSLog(@"string = %@",string);

//所有的key值垦江,所有的value值

NSLog(@"allKeys = %@,allValues = %@",dict.allKeys,dict.allValues);

return 0;

}

}

OC方法格式

//

//? ViewController.m

//? OC方法格式

//

//? Created by lanou on 16/7/9.

//? Copyright ? 2016年 yhy. All rights reserved.

//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

//視圖加載好的時(shí)候調(diào)用

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//? ? 調(diào)用方法用空格囚枪,方法調(diào)用結(jié)束用中括號(hào)調(diào)用

[self func1];

NSInteger num = [self func2];

NSLog(@"num = %ld",num);

NSInteger length = [self lengthofString:@"abcdef"];

NSLog(@"length = %ld",length);

NSString *str5 = [self stringIsStr1:@"hallow" withStr2:@"world"];

NSLog(@"str3 = %@",str5);

}

//OC方法的格式

//+表示類方法,只能用類調(diào)用抹凳,-表示實(shí)力方法只能用對(duì)象調(diào)用

//無參數(shù)輸入的方法格式:+/- (方法的返回值)方法名

//有參數(shù)輸入的方法格式: +/-(方法的返回值)方法名:(參數(shù)1類型)參數(shù)1名 方法名:(參數(shù)2類型)參數(shù)2名

//輸入字符串返回字符串的長(zhǎng)度

-(NSInteger)lengthofString:(NSString*)string{

return string.length;

}

-(void)func1{

NSLog(@"%s",__func__);}

-(NSInteger)func2{

NSLog(@"%s",__func__);

return 20;

}

-(NSString *)stringIsStr1:(NSString *)str1 withStr2:(NSString *)str2{

NSString *str3 = [NSString stringWithFormat:@"%@%@",str1,str2];

return str3;

}

//內(nèi)存溢出時(shí)調(diào)用

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

總結(jié):

OC基礎(chǔ)語法實(shí)質(zhì)和我們學(xué)習(xí)過的C語言是基本類似的井辜,整體框架相似修壕。例如:頭文件钉凌、變量定義、函數(shù)帐偎、方法的實(shí)現(xiàn)等逐纬。當(dāng)然也有所差別,語言代碼的編寫削樊、符號(hào)等豁生,都有差別兔毒。

第一天的實(shí)訓(xùn),讓我們初步了解了IOS開發(fā)的一些常識(shí)問題甸箱,初步接觸一些簡(jiǎn)單的語法知識(shí)育叁,在今后的學(xué)習(xí)中將會(huì)試著嘗試開發(fā)一些小游戲、簡(jiǎn)單的應(yīng)用程序芍殖。當(dāng)然豪嗽,學(xué)習(xí)OC之前應(yīng)熟練掌握C、C++豌骏、Java等語言龟梦,編程語言都是相通的。


一:OC介紹

1.OC簡(jiǎn)介 ?

OC是以SmallTalk為基礎(chǔ)窃躲,建立在C語言之上变秦,是C語言的超集。20世紀(jì)80年代早期由Brad J.Cox設(shè)計(jì),2007年蘋果公司發(fā)布了OC2.0,并在iPhone上使用OC進(jìn)行開發(fā)框舔。

2.IDE

編寫OC程序最主要的編譯環(huán)境是Xcode,它是蘋果官方提供的IDE,官網(wǎng)中的SDK包括Xcode,可以通過下載SDK來獲得它。但是Xcode只支持MacOSX,所以如果要在其它環(huán)境下編寫OC程序,要使用其它IDE赎婚。Linux/FreeBSD用GNUStep,Windows NT5.x(2000,XP)要先安裝cywin或mingw,然后安裝GNUStep刘绣。同時(shí)僅僅通過文本編輯器,GCC的make工具也可以用于開發(fā)。

注:如果要使用到Cocoa的話挣输,只能在Apple公司的Xcode上纬凤。

3.框架

OC編程中主要用到的框架是Cocoa,它是MacOSX中五大API之一,它由兩個(gè)不同的框架組成FoundationKit和ApplicationKit。Foundation框架擁有100多個(gè)類,其中有很多有用的撩嚼、面向數(shù)據(jù)的低級(jí)類和數(shù)據(jù)類型,如NSString,NSArray,NSEnumerator和NSNumber停士。ApplicationKit包含了所有的用戶接口對(duì)象和高級(jí)類。

4.OC代碼特點(diǎn)

初次接觸OC時(shí),會(huì)發(fā)現(xiàn)許多和其它語言不同的地方,會(huì)看到很多的+,-,[ ,] ,@,NS等符號(hào),這些符號(hào)在以后的編程中將經(jīng)惩昀觯看到恋技。

#import"ClassA.h"

#import

intmain( int argc, const char *argv[] ) {

ClassA*c1= [[ClassAalloc]init];

ClassA*c2= [[ClassAalloc]init];

//print count

printf("ClassAcount: %i\\\\n", [ClassAinitCount] );

ClassA*c3= [[ClassAalloc]init];

//print count again

printf("ClassA count: %i\\\\n", [ClassA initCount] );

[c1release];

[c2release];

[c3release];

return0;

}

7.優(yōu)缺點(diǎn)

優(yōu)點(diǎn):類別、扮演(Posing)逻族、動(dòng)態(tài)類型蜻底、指針計(jì)算、彈性信息傳遞聘鳞、不是一個(gè)過度復(fù)雜的c衍生語言薄辅、可通過Objective-c++與c++結(jié)合

缺點(diǎn):沒有命名空間、沒有操作符重載抠璃、不像c++那樣復(fù)雜

二:對(duì)C的擴(kuò)展

1.擴(kuò)展名

OC是ANSI版本C的一個(gè)超集,它支持相同的C語言基本語法站楚。與C一樣,文件分為頭文件和源文件,擴(kuò)展名分別為.h和.m。如果要加入c++的語法,需要用到.mm

.h

頭文件搏嗡。頭文件包涵類的定義窿春、類型、方法以及常量的聲明

.m

源文件。這個(gè)典型的擴(kuò)展名用來定義源文件谁尸,可以同時(shí)包含C和Objective-C的代碼舅踪。

2.#import

在OC里,包含頭文件有比#include更好的方法#import。它的使用和#include相同,并且可以保證你的程序只包含相同的頭文件一次良蛮。相當(dāng)于#include+ #pragma once的組合抽碌。

例如要包含F(xiàn)oundation框架中的Foundation.h文件,可以像下面這樣。

#import

注:每個(gè)框架有一個(gè)主的頭文件,只要包含了這個(gè)文件,框架中的所有特性都可以被使用决瞳。

3.@符號(hào)

@符號(hào)是OC在C基礎(chǔ)上新加的特性之一货徙。常見到的形式有@”字符串”,%@ , @interface,@implement等。@”字符串”表示引用的字符串應(yīng)該作為Cocoa的NSString元素來處理皮胡。@interface等則是對(duì)于C的擴(kuò)展,是OC面向?qū)ο筇匦缘捏w現(xiàn)痴颊。

注:小技巧,只要看到@符號(hào),就可以認(rèn)為它是對(duì)于C的一個(gè)擴(kuò)展。

4.NSLog()

在OC中用的打印函數(shù)是NSLog(),因?yàn)镺C是加了一點(diǎn)”特殊語料”的C語言,所以也可以用printf()但是NSLog()提供了一些特性,如時(shí)間戳,日期戳和自動(dòng)加換行符等,用起來更方便,所以推薦使用NSLog()屡贺。下面是兩種輸出的對(duì)比蠢棱。

使用NSLog()輸出任意對(duì)象的值時(shí),都會(huì)使用%@格式說明。在使用這個(gè)說明符時(shí),對(duì)象通過一個(gè)名為description的方法提供自己的NSLog()格式甩栈。

下面分別是使用NSLog()和使用printf()的相應(yīng)輸出:

2016-07-09 15:54:21泻仙。42610_15[1973:207] Hello World!

HelloWorld!

注:NS前綴告訴你函數(shù)來自Cocoa而不是其他工具包。

5.BOOL

BOOL是OC中的布爾類型,它和C中的bool有如下區(qū)別

BOOL

YES(1),NO(0)

bool

true(!0),false(0)

6.id

這是OC新加的一個(gè)數(shù)據(jù)類型,它是一般的對(duì)象類型,能夠存儲(chǔ)任何類型的方法量没。

7.nil

在OC中,相對(duì)于C中的NULL,用的是nil玉转。這兩者是等價(jià)的。下面是nil的定義殴蹄。

#definenil NULL

三:創(chuàng)建對(duì)象

1.接口和實(shí)現(xiàn)

在OC中定義一個(gè)類需要有兩個(gè)部分:接口和實(shí)現(xiàn)究抓。接口文件包含了類的聲明,定義了實(shí)例變量和方法。實(shí)現(xiàn)文件包含了具體的函數(shù)的實(shí)現(xiàn)代碼袭灯。下面的代碼顯示了MyClass這個(gè)類的實(shí)現(xiàn)代碼刺下。就像類的定義規(guī)則一樣,類實(shí)現(xiàn)文件也被兩個(gè)標(biāo)識(shí)框起來,一個(gè)是 @implementation,還有一個(gè)是@end。這兩個(gè)指令標(biāo)識(shí)符告訴編譯器程序從哪里開始編譯到哪里結(jié)束稽荧。類中的方法名稱的定義和它接口文件中的 定義是一樣的,除了實(shí)現(xiàn)文件中有具體的代碼以外怠李。

@implementationMyClass

-(id)initWithString:(NSString *) aName

{

if(self = [super init]) {

countcount = 0;

data= nil;

name= [aName copy];

returnself;

}

}

+(MyClass *)createMyClassWithString: (NSString *) aName

{

return[[[self alloc] initWithString:aName] autorelease];

}

@end

當(dāng)你要把一個(gè)對(duì)象保存進(jìn)變量,要使用指針類型蛤克。OC同時(shí)支持強(qiáng)和弱變量對(duì)象捺癞。強(qiáng)類型對(duì)象在變量類型定義的時(shí)候包含了類名。弱對(duì)象使用id類型作為實(shí)例變量构挤。下面的例子同時(shí)顯示了定義MyClass中的強(qiáng)弱兩種類型的變量

MyClass*myObject1;// Strong typing

idmyObject2;// Weak typing

2.方法

一個(gè)方法定義包含了方法類型髓介,返回類型,一個(gè)或者多個(gè)關(guān)鍵詞筋现,參數(shù)類型和參數(shù)名唐础。在OC中一個(gè)類中的方法有兩種類型:實(shí)例方法箱歧,類方法。實(shí)例方法前用(-)號(hào)表明,類方法用(+)表明,通過下圖可以看到,前面有一個(gè)(-)號(hào),說明這是一個(gè)實(shí)例方法一膨。

在OC中呀邢,調(diào)用一個(gè)方法相當(dāng)于傳遞一個(gè)消息,這里的消息指的是方法名和參數(shù)豹绪。所有的消息的分派都是動(dòng)態(tài)的价淌,這個(gè)體現(xiàn)了OC的多態(tài)性。消息調(diào)用的方式是使用方括號(hào)瞒津。如下面的例子中蝉衣,向myArray對(duì)象發(fā)送insertObject:atIndex:這個(gè)消息。

[myArrayinsertObject:anObj atIndex:0];

這種消息傳遞允許嵌套

[[myAppObjectgetArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];

前面的例子都是把消息傳遞給實(shí)例變量巷蚪,你也可以把消息傳遞給類本身病毡。這時(shí)要用類方法來替代實(shí)例方法 。你可以 把他想象成靜態(tài)C++類(當(dāng)然不完全相同)屁柏。

類方法的定義只有一個(gè)不一樣那就是用加號(hào)(+)代替減號(hào)(-)啦膜。下面就是使用一個(gè)類方法。

NSMutableArray*myArray = nil;// nil is essentially the same as NULL

//Create a new array and assign it to the myArray variable.

myArray =[NSMutableArray arrayWithCapacity:0];

3.屬性

屬性提供了比方法更方便的訪問方式淌喻。通過property標(biāo)識(shí)符來替代getter和setter方法功戚。使用方法就是在類接口文件中用@property標(biāo)識(shí)符,后面跟著變量的屬性似嗤,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然后是變量名届宠。同時(shí)在實(shí)現(xiàn)文件中用@synthesize標(biāo)識(shí)符來取代getter和setter方法烁落。

@propertyBOOL flag;

@property(copy) NSString* nameObject;

//Copy the object during assignment.

@property(readonly) UIView* rootView;// Create only a getter method

接口文件中使用@property

@synthesizeflag,nameObject,rootView;

實(shí)現(xiàn)文件中使用@synthesize

屬性的另一個(gè)好處就是,可以使用點(diǎn)(.)語法來訪問豌注,如下所示:

myObject.flag= YES;

CGRectviewFrame = myObject.rootView.frame;

四:繼承

繼承的語法如下伤塌,冒號(hào)后的標(biāo)識(shí)符是需要繼承的類。

@interfaceCircle : NSObject

1.不支持多繼承

要注意的是OC只支持單繼承轧铁,如果要實(shí)現(xiàn)多繼承的話每聪,可以通過類別和協(xié)議的方式來實(shí)現(xiàn)。

2.Super關(guān)鍵字

OC提供某種方式來重寫方法齿风,并且仍然調(diào)用超類的實(shí)現(xiàn)方式药薯。當(dāng)需要超類實(shí)現(xiàn)自身的功能,同時(shí)在前面或后面執(zhí)行某些額外的工作時(shí)救斑,這種機(jī)制非常有用童本。為了調(diào)用繼承方法的實(shí)現(xiàn),需要使用super作為方法調(diào)用的目標(biāo)脸候。下面是代碼示例:

@implementationCircle

-(void)setFillColor:(ShapeColor) c

{

if(c== kRedColor){

c= kGreenColor;

}

[supersetFillColor: c];

}

@end

Super來自哪里呢穷娱?它既不是參數(shù)也不是實(shí)例變量绑蔫,而是由OC編譯器提供的某種神奇功能。向super發(fā)送消息時(shí)泵额,實(shí)際上是在請(qǐng)求OC向該類的超類發(fā)送消息配深。如果超類中沒在定義該消息,OC將按照通常的方式在繼承鏈中繼續(xù)查找對(duì)應(yīng)的消息嫁盲。

五:對(duì)象初始化

1.分配與初始化

對(duì)象的初始化有兩種方法:一種是[類名new], 第二種是[[類名 alloc]init]篓叶。這兩種方法是等價(jià)的,不過亡资,通常的Cocoa慣例是使用alloc和init,而不使用new.一般情況下澜共,Cocoa程序員只是在他們不具備足夠的水平來熟練使用alloc和init方法時(shí),才將new作為輔助方法使用锥腻。

[[類名alloc]init]有兩個(gè)動(dòng)作嗦董。alloc是分配動(dòng)作,是從操作系統(tǒng)獲得一塊內(nèi)存并將其指定為存放對(duì)象的實(shí)例變量的位置瘦黑。同時(shí)京革,alloc方法還將這塊內(nèi)存區(qū)域全部初始化為0。與分配動(dòng)作對(duì)應(yīng)的是初始化幸斥。有如下兩種初始化寫法匹摇。

Car *car =[[Class alloc] init];

寫法1

Car*car = [Car alloc];

[carinit];

寫法2

應(yīng)該使用第一種寫法,因?yàn)閕nit返回的對(duì)象可能不是以前的那個(gè)甲葬。

2.編寫初始化方法

下面是一段初始化的代碼

-(id)init

{

if(self = [superinit]){

engine = [Enginenew];

}

}

使用self= [super init]的作用是使超類完成它們自己的初始化工作廊勃。同時(shí)因?yàn)閕nit可能返回的是不同的對(duì)象,實(shí)例變量所在的內(nèi)存位置到隱藏的self參數(shù)之間的跳離又是固定的经窖,所以要這樣使用坡垫。

六:協(xié)議

這里的協(xié)議是正式協(xié)議,相對(duì)的還有非正式協(xié)議画侣。正式協(xié)議是一個(gè)命名的方法列表冰悠。它要求顯式地采用協(xié)議。采用協(xié)議意味著要實(shí)現(xiàn)協(xié)議的所有方法配乱。否則溉卓,編譯器會(huì)通過生成警告來提醒你。

1.聲明協(xié)議

@protocolNSCopying

-(id)copyWithZone:(NSZone*)zone;

@end

2.采用協(xié)議

@interface Car :NSObject

{

// instancevariables

}

@end

協(xié)議可以采用多個(gè)搬泥,并且可以按任意順序列出這些協(xié)議桑寨,沒有什么影響。

3.OC 2.0的新特性

OC2.0增加了兩個(gè)新的協(xié)議修飾符:@optional和@required,因此你可以像下面這樣編寫代碼:

@protocolBaseballPlayer

-(void)drawHugeSalary;

@optional

-(void)slideHome;

-(void)catchBall;

@required

-(void)swingBat;

@end

因此忿檩,一個(gè)采用BaseballPlayer協(xié)議的類有兩個(gè)要求實(shí)現(xiàn)的方法:-drawHugeSalary和-swingBat,還有3個(gè)不可選擇實(shí)現(xiàn)的方法:slideHome,catchBall和throwBall西疤。

七:委托

Cocoa中的類經(jīng)常使用一種名為委托(delegate)的技術(shù),委托是一種對(duì)象休溶,另一個(gè)類的對(duì)象會(huì)要求委托對(duì)象執(zhí)行它的某些操作代赁。常用的是扰她,編寫委托 對(duì)象并將其提供給其他一些對(duì)象,通常是提供給Cocoa生成的對(duì)象芭碍。通過實(shí)現(xiàn)特定的方法徒役,你可以控制Cocoa中的對(duì)象的行為。

通過下面的例子窖壕,可以更清楚地理解委托的實(shí)現(xiàn)原理忧勿。其中A對(duì)象需要把一些方法委托給其它對(duì)象來實(shí)現(xiàn),例子中就是對(duì)象B瞻讽,B實(shí)現(xiàn)了含A對(duì)象特定方法的協(xié)議ADelegate鸳吸,從而可以在B中實(shí)現(xiàn)A委托的方法。

@protocolADelegate

-(void)aDelegateMethod;

……

@end

@interfaceA : NSObject {

……

iddelegate;

}

@property(readwrite, assign)

iddelegate;

……

@end

@implementationA

@synthesizedelegate;

-(void)aMethod{

[delegateaDelegateMethod];

……

}

@end

A類

@interfaceB : NSObject

@end

@implementationB

-(id)init {

……

[[AsharedA] setDelegate:self];

}

-(void)aDelegateMethod{//B中實(shí)現(xiàn)A委托的方法

……

}

@end

八: 類別

類別允許你在現(xiàn)有的類中加入新功能速勇,這些類可以是框架中的類晌砾,并且不需要擴(kuò)充它。

1.聲明類別

@interfaceNSString (NumberConvenience)

-(NSNumber *)lengthAsNumber;

@end

該聲明表示烦磁,類別的名稱是NumberConvenience养匈,而且該類別將向NSString類中添加方法。

2.實(shí)現(xiàn)類別

@implementationNSString (NumberConvenience)

-(NSNumber*) lengthAsNumber

{

unsigned intlength = [self length];

return([NSNumber numberWithUnsignedInt: length]);

}

@end

3.局限性

類別有兩方面的局限性都伪。第一呕乎,無法向類中添加新的實(shí)例變量。類別沒有位置容納實(shí)例變量陨晶。第二猬仁,名稱沖突,即類別中的方法與現(xiàn)有的方法重名先誉。當(dāng)發(fā)生名稱沖突時(shí)湿刽,類別具有更高的優(yōu)先級(jí)。這點(diǎn)可以通過增加一個(gè)前綴的方法解決谆膳。

4.非正式協(xié)議和委托類別

實(shí)現(xiàn)委托除了第七節(jié)中應(yīng)用協(xié)議的方式,還可以使用類別撮躁。具體做法就是把委托對(duì)象要實(shí)現(xiàn)的方法聲明為一個(gè)NSObject的類別漱病。如下面的代碼所示:

@interfaceNSObject(NSSomeDelegateMethods)

-(void)someMethod;

@end

通過將這些方法聲明為NSObject的類別,使得只要對(duì)象實(shí)現(xiàn)了委托方法把曼,任何類的對(duì)象都可以成為委托對(duì)象杨帽。創(chuàng)建一個(gè)NSObject的類別稱為“創(chuàng)建 一個(gè)非正式協(xié)議”。非正式協(xié)議只是一種表達(dá)方式嗤军,它表示“這里有一些你可能想實(shí)現(xiàn)的方法”注盈。

非正式協(xié)議的作用類似于使用許多@optional的正式協(xié)議,并且前者正逐漸被后者所代替叙赚。

5.選擇器

選擇器只是一個(gè)方法名稱老客,它以O(shè)C運(yùn)行時(shí)使用的特殊方式編碼僚饭,以快速執(zhí)行查詢。你可以使用@selector()預(yù)編譯指令指定選擇器胧砰,其中方法名位于圓括號(hào)中鳍鸵。如一個(gè)類中setEngine:方法的選擇器是:@selector(setEngine:)。

因?yàn)檫x擇器可以被傳遞尉间,可以作為方法的參數(shù)使用偿乖,甚至可以作為實(shí)例變量存儲(chǔ)。這樣可以生成一些非常強(qiáng)大和靈活的構(gòu)造哲嘲。

第九節(jié):Posing

Posing有點(diǎn)像類別贪薪,但不太一樣。它允許你擴(kuò)充一個(gè)類眠副,并且全面性地扮演(pose)這個(gè)超類画切。例如:你有一個(gè)擴(kuò)充NSArry的 NSArrayChild對(duì)象。如果你讓NSArrayChild扮演NSArry,則在你的代碼中所有的NSArray都會(huì)自動(dòng)被替代為 NSArrayChild.

@interfaceFractionB: Fraction

-(void)print;

@end

@implementationFractionB

-(void)print {

printf("(%i/%i)", numerator, denominator );

}

@end

Fraction.m

intmain( int argc, const char *argv[] ) {

Fraction*frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10];

//print it

printf("The fraction is: " );

[fracprint];

printf("\\\\n" );

//make FractionB pose as Fraction

[FractionBposeAsClass: [Fraction class]];

Fraction*frac2 = [[Fraction alloc] initWithNumerator: 3 denominator: 10];

//print it

printf("The fraction is: " );

[frac2print];

printf("\\\\n" );

//free memory

[fracrelease];

[frac2release];

return0;

}

Main.m

Thefraction is: 3/10

Thefraction is: (3/10)

輸出

這個(gè)程序的輸出中侦啸,第一個(gè)fraction會(huì)輸出3/10,而第二個(gè)會(huì)輸出(3/10)槽唾,這是FractionB中實(shí)現(xiàn)的方式。poseAsClass這個(gè)方法是NSObject的一部分光涂,它允許子類扮演超類庞萍。

第十節(jié):動(dòng)態(tài)識(shí)別 (Dynamictypes)

下面是應(yīng)用動(dòng)態(tài)識(shí)別時(shí)所用到的方法:

-(BOOL)isKindOfClass:classObj

是否是其子孫或一員

-(BOOL)isMemberOfClass:classObj

是否是其一員

-(BOOL)respondsToSelector:selector

是否有這種方法

+(BOOL)instancesRespondToSelector:selector

類的對(duì)象是否有這種方法

-(id)performSelector:selector

執(zhí)行對(duì)象的方法

通過下面的代碼可以更清楚地理解動(dòng)態(tài)類型的使用:

import"Square.h"

#import"Rectangle.h"

#import

“intmain( int argc, const char *argv[] ) {

Rectangle*rec = [[Rectangle alloc] initWithWidth: 10 height: 20];

Square*sq = [[Square alloc] initWithSize: 15];

//isMemberOfClass

//true

if( [sq isMemberOfClass: [Square class]] == YES ) {

printf("square is a member of square class\\\\n" );

}

//false

if( [sq isMemberOfClass: [Rectangle class]] == YES ) {

printf("square is a member of rectangle class\\\\n" );

}

//false

if( [sq isMemberOfClass: [NSObject class]] == YES ) {

printf("square is a member of object class\\\\n" );

}

//isKindOfClass

//true

if( [sq isKindOfClass: [Square class]] == YES ) {

printf("square is a kind of square class\\\\n" );

}

//true

if( [sq isKindOfClass: [Rectangle class]] == YES ) {

printf("square is a kind of rectangle class\\\\n" );

}

//true

if( [sq isKindOfClass: [NSObject class]] == YES ) {

printf("square is a kind of object class\\\\n" );

}

//respondsToSelector

//true

if( [sq respondsToSelector: @selector( setSize: )] == YES ) {

printf("square responds to setSize: method\\\\n" );

}

//false

if( [sq respondsToSelector: @selector( nonExistant )] == YES ) {

printf("square responds to nonExistant method\\\\n" );

}

//true

if( [Square respondsToSelector: @selector( alloc )] == YES ) {

printf("square class responds to alloc method\\\\n" );

}

//instancesRespondToSelector

//false

if( [Rectangle instancesRespondToSelector: @selector( setSize: )] ==YES ) {

printf("rectangle instance responds to setSize: method\\\\n" );

}

//true

if( [Square instancesRespondToSelector: @selector( setSize: )] ==YES ) {

printf("square instance responds to setSize: method\\\\n" );

}

//free memory

[recrelease];

[sqrelease];

return0;

}”

輸出:

squareis a member of square class

squareis a kind of square class

squareis a kind of rectangle class

squareis a kind of object class

squareresponds to setSize: method

squareclass responds to alloc method

squareinstance responds to setSize: method

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忘闻,隨后出現(xiàn)的幾起案子钝计,更是在濱河造成了極大的恐慌,老刑警劉巖齐佳,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件私恬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炼吴,警方通過查閱死者的電腦和手機(jī)本鸣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硅蹦,“玉大人荣德,你說我怎么就攤上這事⊥郏” “怎么了涮瞻?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)假褪。 經(jīng)常有香客問我署咽,道長(zhǎng),這世上最難降的妖魔是什么生音? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任宁否,我火速辦了婚禮窒升,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘家淤。我一直安慰自己异剥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布絮重。 她就那樣靜靜地躺著冤寿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪青伤。 梳的紋絲不亂的頭發(fā)上督怜,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音狠角,去河邊找鬼号杠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丰歌,可吹牛的內(nèi)容都是我干的姨蟋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼立帖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼眼溶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晓勇,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤堂飞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绑咱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰筛,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年描融,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铝噩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窿克,死狀恐怖骏庸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情让歼,我是刑警寧澤敞恋,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布丽啡,位于F島的核電站谋右,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏补箍。R本人自食惡果不足惜改执,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一啸蜜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辈挂,春花似錦衬横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拇泣。三九已至,卻和暖如春霉翔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背债朵。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留序芦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓芝加,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親藏杖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 雜談分類:Objective-C 第一節(jié)總括 這一節(jié)是對(duì)Objective-C(以后簡(jiǎn)稱OC)的簡(jiǎn)要介紹,目的是使...
    十年落魄閱讀 2,644評(píng)論 0 6
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,146評(píng)論 30 470
  • 前言:面試筆試都是必考語法知識(shí)點(diǎn)点寥。請(qǐng)認(rèn)真復(fù)習(xí)和深入研究OC。 目錄:iOS-面試題-OC基礎(chǔ)篇 (1) - (84...
    麥穗0615閱讀 4,260評(píng)論 0 33
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問題 3.指南認(rèn)識(shí) 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    陽光的大男孩兒閱讀 4,988評(píng)論 0 13
  • 1.OC里用到集合類是什么敢辩? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,378評(píng)論 0 3