




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
jecve- 培訓第二章數據類型第三章字符串第六章存取器第七章繼態(tài)id類型第九章分類和協(xié)議第十章屬性列表第十一章對象第十二章歸檔第一章程序整體語法結程序的頭文件和源文件的擴展名分別為.h和.mC一樣。Object_C中的nil相當于NULLObject_C中的YESNO相當于truefalse。這里再講解一下YESNO:Object-c提供了BOOLBOOL類型和C++C++0為true0falseObject-c1true并被宏定義為YES,0false并被宏定義為NO。BOOLareIntsDifferent_faulty(intthing1,int{return(thing1-}{}因為areIntsDifferent_faulty方法返回的是兩個整數的差,如果這個差不為1,那么不會為YES。#import<Foundation/Foundation.h>intmain(intargc,constchar*{NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];NSLog(@"Programmingisfun!");return0;}#import相當于#include<…>和。導入該頭文件是因為在程序結尾處用NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init若對象要加入該池,只要發(fā)送一條autorelease消息。NSLog(@"Programmingis將顯示常量字符串,類似于printf函數,并且它會自動在文?后面添加'\n'。當然其中也可以使用轉義NSLog(@"Thesumof50and25is[pooldrain];//釋放內存池 獲得對象:(Car類獲得其對象)youCar=[Carnew];@interface@interface NewClassName:{}每次創(chuàng)建新對象時,將同時創(chuàng)建一組新的實例變量且唯一。注意:在對象類型的右邊都有一個*號,所有的對象變量都是指針類型。Id類型已經被預定義為指針類型,所以不需要加一個*號。任何類型的對象。-/+(returntype)function_name:(parametertype)parameter1otherParameter:(parameter_type)如果只有一個參數,在:后面參數的類型和名稱;如果有多個參數的話,每個參數前面都要有一個:,然后接著是參數類型和參數名稱??墒谴蠹铱赡苓€是覺得很奇怪。比如上面這個例子中,otherParameterobjectivec中,對于有多個參數的函數,可以理解為將函數的名稱拆如在C++voidinitializeRectangle(intx1,inty1,intx2,int但并不知道這些參數都是什么意思;但在objectivec中,可以這樣voidinitializeRectange:(int)x1LeftUpY:(int)y1RightBottomX:@implementation //NewClassName表示的名稱與@interface#import<Foundation/Foundation.h> Fraction:{intnumerator;}(void)setNumberator:(int)(void)setDenominator:(int)d;//Fraction.m@implementation{}(void)setNumberator:(int){numerator=}(void)setDenominator:(int){denominator=} *myFraction=[[Fraction init]個新實例,然后向新創(chuàng)建的實例對象發(fā)送init消息來初始化該對象。Fraction*myFraction= setNumerator用完釋放Fraction對象的方法 平臺不支持回收機制 Rectangle:{ width heigth} intwidth(int)area(int)perimeter andHeigth:(int)h//Rectangle.m文件#import"Rectangle.h"@implementationRectangle width,heigth andHeigth:({ w h}{ width*heigth}{ (width+heigth)*2}下面是Rectangle的子類#import Square:(void)setSide:(int)s(int)side@end#import@implementationSquare(void)setSide:({[selfsetWidth: andHeight:}{ width}@endself關鍵字用來指明對象是當前方法的接收者。(void)setSide:{[selfsetWidth: andHeight:}:#define語句和c#運算符: str(x)表示在調用該宏時,預處理程序根據宏參數創(chuàng)建C風格的常量字符串。#import語句相當于#include#import#條件編譯語句(#ifdef、#endif#else#ifndef)和C#undef其他基?的C語言特性:CompoundLiteral是包含在括號之內的類型名稱,之后是一個初始化列表。 如果intPtr為int*類型:intPtr=(int[100]){[0]=1,[50]=50,[99]=其他如循環(huán)語句(dowhile、while、for)、條件語句(if語句(if-else、復合判斷條件等、switch語句)、Boolean(YESNO)、條件運算符、goto語句、空語句、逗號表達式、sizeof運算符、命令行參數、位操作都和C一樣。第二章數據類Object-c提供基?數據類型:int、float、double、 整型第一位為0,NSLog的格式符為: %#o十六進制以0x開頭的整型,NSLog的格式符為: 若(%X或%#X)NSLogNSLog的格式符 NSLog的格式符 指數的值小于-4大于5,采用%e,否則采用0x0X,后面緊跟一個或多個十進制或十六進制數字,再后是pP,最后是可以帶符號的二進制指數。例:0x0.3p10表示的值為3/16*210注:若無特殊說明,Object-c將所有的浮點常量看做double值,要顯示double值可使用和floatNSLoglongdouble常量寫成尾部帶有字母l或者L的浮點常量。NSLog longlonglongshortunsignedshortunsignedunsignedlongunsignedlonglong 處理Boolean(0 intnumber; 在類中定義靜態(tài)變量和Cvoaltile說明符和const正好相反,明確告訴編譯器,指定類型變量的值會改變。(I/O端口)比如要將輸出端口的地址在outPort的變量中。volatilechar*outPort=*outPort=枚舉數據類型、typedef語法以及數據類型的轉換和C第三章字符串 1、NSRangerange;range.length=2、NSRangerange17Cocoa提供創(chuàng)建這些數據類型方法:NSMakePoint(、NSMakeSize()表示字符串的類NSString*heigth stringWithFormat:@"Youheigthis%dfeet,%dinches",unsignedintlength= 返回Bool-(BOOLisEqualToString(NSString*)aString;//比較兩個字符串的內容是否相等還可以使用compare:方法 parisonResult)compare:(NSString*)string;//逐個字符比較 parisonResult)compare:(NSString*)stringoptions:(unsigned)mask; parisonResult是一個枚舉值options是一個位掩碼,即:NSCaseInsensitiveSearch:不區(qū)分大小寫NSLiteralSearch: 進行完全比較, 如果你想知道字符串內的某處是否包含其他字符串,使用rangeOfString:-(NSRange)rangeOfString:(NSStringNSString是不可變的,NSMutableString是可變的。用方法stringWithCapacityNSMutableString*string=[NSMutableStringstringWithCapacity可以使用appendString:或appendFormat:(void)appendString:(NSString(void)appendFormat:(NSString*)format,...可以使用deleteCharactersInRange:(void)deleteCharactersInRange:集合限制:只能Objective—C的對象,不能C語言的基?數據類型(int、float、enum、struct、或者中的隨機指針。同時也不能nil(對象的零值或NULL值NSArray*array arrayWithObjects:@"one",@"two", int)index使用componentsSeparatedByString:來切分NSArray,NSString*string=@"oop:ack:bork:greeble:ponies";NSArray*chunks= componentsSeparatedByString:使用componentsJoinedByString:來合并NSArraystring= componentsJoinedByString:@":-)"]可變數組NSMutableArray通過類方法arrayWithCapacity:來創(chuàng)建可變數組+(id)arrayWithCapacity:(unsigned)numItemsNSMutableArray*array= arrayWithCapacity:使用addObjectNSEnumerator要想使用NSEnumerator,需要通過objectEnumerator(NSEnumerator*)objectEnumerator;NSEnumerator*enumerator;enumeratorarrayobjectEnumerator注:若想從后向前枚舉集合,使用方法rvrsojtnurtor;獲得枚舉器以后,開始wile循環(huán),每次循環(huán)都向這個枚舉器請求它的nxtObjt(id)nextObject;//nil表明循環(huán)結束for(NSString }{[book}//創(chuàng)建一個SEL類型的selector,sortUsingSelector:使用該方法比較數組中的兩個元素, 回值為:若小于返回NSOrderedAscending;相等返回NSOrderedSame;大于返回NSOrderedDescending- {return[namecompare:[element}NSDictionary(關鍵字和定義的組合NSDictionary通常在給定一個關鍵字(通常是一個NSString字符串)下一個數值(可以是任何使用dictionaryWithObjectsAndKeys:來創(chuàng)建字典Tire*t1= NSDictionary*tires=[ dictionaryWithObjectsAndKeys:t1,@"front-使用方法objectForKeyTire*tire=[tiresobjectForkey:@"front-創(chuàng)建新的NSMutableDictionary對象,向類NSMutableDictionary發(fā)送dictionarydictionaryWithCapacity +(id)dictionaryWithCapacity(unsignedint)numItems;setObject:forKey:方法給字典添加元素setObject:forKey:(id)aKey下面是另一種使用發(fā)送dictionaryNSMutableDictionarytires= dictionary] setObject forKey:@"front-..可以使用removeObjectForKey (void)removeObjectForKey:(id)aKey注:不要去創(chuàng)建NSString、NSArray或NSDictionary的子類,實在要的話可以用復合的方式來解決問題。使用這種方法枚舉詞典:for(NSString*keyin{..}#import常用的NSSet---確定集合是否包含--(NSEnumerator-nsset-在對象nsset-----從集合中刪除對象----注:NSInteger?數據類型的typedef,被typedef64long32intNSNumber類來包裝基?+(NSNumber*)numberWithChar:(char)value+(NSNumber*)numberWithInt:(int)value+(NSNumber*)numberWithFloat:(float)value+(NSNumber*)numberWithBool:(BOOL)value;還有包括無符號版?和各種long型數據及l(fā)onglong整型數據 numberWithInt 42]將一個基?類型封裝到NSNumber NSNumber實際上是NSValue的子類,NSValueNSValue將結構放入NSArray和NSDictionary中。創(chuàng)建新的+(NSValue*)valueWithBytes:(constvoid *)valueobjCType:(constchar NSValue*value;value=[NSValuevalueWithBytes: 使用getValue:來提取數值(傳遞的是要這個數值的變量的地址)(先找地址再取值)value=[array objectAtIndex:0];[ getValue:&rect]注:Cocoa提供了將常用的struct型數據轉化成NSValue+(NSValue*)valueWithPoint:(NSPoint)point+(NSValue*)valueWithSize:(+(NSValue*)valueWithRect:( null]//總返回一樣的值(NSNull*)null; setObject:[NSNullnull]forKey: home=[contast objectForKey:@"home"]; (home==[NSNullnull]){..}}NSFileManager允許對文件系統(tǒng)進行操作(創(chuàng) //NSFileManagerNSFileManager*manager= defaultManager]NSString*home=[@"~"stringByExpandingTildeInPath] #import<Foundation/Foundation.h>intmain(intargc,constchar*argv[])NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]NSFileManagermanager=[NSFileManagerNSStringhome=[@"~"NSDirectoryEnumeratordirenum=[managerenumeratorAtPath:NSMutableArrayfiles=[NSMutableArrayarrayWithCapacity:NSStringwhile(filename=[direnumnextObject])if([[filename {[filesaddObject:}}NSEnumeratorfileenum=[fileswhile(filename=[fileenumnextObject])NSLog(@"%@",return0;}第四章存NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];[pooldrain];象的。通過向目前的自動釋放池發(fā)送一條autorelease消息,可以將一個對象添加到其中。概念:創(chuàng)建對象時,將它的次數設置為1,每一次必須保持該對象時,就發(fā)送一條retain消息,使其次數加1。[myFraction[myFractionrelease];當計數為0的時候,系統(tǒng)就會釋放它的內存,通過向對象發(fā)送dealloc消息。通過向對象發(fā)送retainCount消息可以獲得這個對象的計數,返回的是NSUInteger整數。只要對象的計數不為0,系了,即對象將被銷毀(通過調用dealloc方法。intmain(intargc,constchar*{NSAutoreleasePoolpool=[[NSAutoreleasePoolalloc]tracker=[RetainTrackernew];//count:[trackerretain];//count:[trackerautorelease];//count:still2[trackerrelease];//count:1NSLog(@"releasingpool");[poolrelease];//getsnuked,sendsreleasetotrackerreturn(0);} 、ew或者通過copy消息(生成接受對象的一個副?)創(chuàng)建一個對象,對象的計數器被設置成1。發(fā)送retain消息將增加計數器,release消息減1。要獲得計數器的當前值,可以發(fā)送retainCount消(id)retain(void)release(unsinged)retainCount(void)setEngine:(Engine*){ retain]; release];engine= }獲得對象時保留,在dealloc對象發(fā)送一條dealloc消息來釋放它所占的內存。3、自動釋放池在釋放池?身的時候自動釋放池中的對象。系統(tǒng)向每個對象發(fā)送一條release息,對計數變?yōu)?的對象發(fā)送一條dealloc消息來釋放它所占的內存。5、若使用alloccopy(或使用allocWithZonecopyWithZone:mutableCopy來直接創(chuàng)建對象,則由你負責釋放它。每次retainreleaseautoreleas#import@interfaceTire:{floatpressure;}(id)initWithPressure:(float)(id)initWithPressure:(float)treadDepth:(float) (void)setPressure:(float)(float)(void)setTreadDepth:(float)@end//Tire#import"Tire.h"(id){if(self=[selfinitWithPressure:treadDepth:20])}return}//(id)initWithPressure:(float){if(self=[selfinitWithPressure:treadDepth:20.0])}return}//{if(self=[selfinitWithPressure:treadDepth:td])}return}//(id)initWithPressure:(float)treadDepth:(float){if(self=[super{pressure=p;treadDepth=td;}return}//(void)setPressure:(float){pressure=}//(float){return}//(void)setTreadDepth:(float){treadDepth=}//(float){return}//(NSString*){NSStringdesc=[NSString@"Tire:Pressure:%.1fTreadDepth:%.1f",pressure,treadDepth];return@end//Tire通常的寫法:-{if(self= ..} (self)}有些類包含多個以init開頭的方法:例如NSString類中的一些初始化方法:NSString*emptyString= init]NSString*string= initWithFormat:@"%dor%d",25,624]NSString*string= initWithContentOfFile:@"/tmp/words.txt"]init第六章存取#import<Cocoa/Cocoa.h>@classTire;@class@interfaceCar:{NSString*name;NSMutableArray*tires;Engine*engine;}@property(copy)NSString*name@property(retain)Engine*engine(void)setTire:(Tire*) atIndex:(int)(Tire*)tireAtIndex:(int)index(void)print; #import"Car.h" name; engine;(id){if(self=init]){name=@"Car"tires=[[NSMutableArray i;for(i=0;i<[tiresaddObject: null]]}}return(self)}{[namerelease];[tiresrelease];[superdealloc];(void)setTire:(Tire*)tireatIndex:(int){ replaceObjectAtIndex: withObject:tire](Tire*)tireAtIndex:(int){Tiretire=[tires objectAtIndex:index]; (tire);(void){NSLog(@"%@has:",[self tireAtIndex:i]); i;for(i=0;i<4;i tireAtIndex:i])}NSLog(@"%@",engine)Car*car=[[Car init];=@"Herbie"carengine=[[Slant6alloc]init];//Slant6Engine的子類@propertyfloatrainHandling表明類的對象具有float類型的屬性,其名稱:rainHandling,而且可以調用-setRainHandling:來設置屬性,調用-rainHandling來屬性。@property的作用是自動屬性的setter和getter方法。@synthesize =方法,但在其實現中使用appel@property(readwrite,copy)NSString*name;//對象可讀寫,對象將被@property(readonly)NSString*name;////對象只讀點表達式(.)在等號左邊,該屬性名稱的setter方法將被調用。若在右邊,則可以調用屬性名稱的注意:在使用特性的時候經常出現,提示的對象不是struct類型,請檢查你是否包含了使用的類該技術同樣適用于int、char、BOOL、struct甚至可以定義一個NSRect補充1、/CjtiveC(ndlte或llofre),jtiv-C也有自loloihone長度(字節(jié)1-128~-27~(27-4-2147483648~-231~(231-short2-32768~-215~(215-long4-2147483648~-231~(231-longlong8-263~(263-long198154unsignedshort20~(216-unsigned40~(232-unsignedlong40~(232-unsignedlonglong80~(264-1Objective-CSquare類繼承于Rectangle類@interfaceRectangle: {intwidth;int}@propertyintwidth, //-(int)//Rectangle類定義#import"Rectangle.h"@implementationRectangle@synthesizewidth,height;{returnwidth*}-(int){return(width+height)*}//Square類#import"Rectangle.h"@interfaceSquare //-(void)setSide:(int) //Square類定義#import"Square.h"@implementationSquare-(void)setSide:(int){[selfsetWidth:sandHeight:selfsetWidthandHeight:}-(int){return}Rectangle類只了矩形大小?,F在要添加原點(x,y)的概念。因此,定義一個名為XYPoint的類//XYPoint類#import<Foundation/Foundationh>@interfaceXYPoint:NSObject{intx;int}@propertyintx, -(void)setX:(int)xValandY:(int)yVal;//XYPoint類定義#import"XYPointh"@implementationXYPoint@synthesizex,y;-(void)setX:(int)xValandY:(int){x=xVal;y=}#import<Foundation/Foundationh>@class //代替#importXYPoint//使用@class指令提高效率,編譯器不需要處理整XYPointh文件,//只需要XYPoint是一個類名,但是如果需要XYPoint類中方//法,@class指令是不夠的,必須用#import@interfaceRectangle:{intwidth;intXYPoint}-(int)-(int)perimeter;第八章動態(tài)綁定和id類#import"Fraction.h"#import" //printintmain(intargc,char{NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];Fraction*f=[[Fractionalloc]init]; *c=[[Complexalloc]id //dataValue為id類[fsetTo:2over:5];[csetReal:10.0andImaginary: //將Fractionf到dataValue[dataValue //將Complexc到dataValue[dataValue //問題:兩次遇到[dataValueprint];Fraction和Complex類中都定義有print方法,系統(tǒng)如何知道//答案:在程序執(zhí)行期間,當系統(tǒng)準備將print消息發(fā)送給dataValue時,它首先檢查dataValue中[frelease];[crelease];return0;}Fraction類,除了將兩個分數相加的add:方法外,還想要擁有將兩個分數相減、相乘和相除的方//Fraction類@interfaceFraction:NSObject{intnumerator;}@propertyintnumerator,-(void)setTo:(int)nover:(int)-(Fraction*)add:(Fraction*) //分數的加法函現在,從接口部分刪除add:方法,并將其添加到新分類,同時添加其他三種要實現的數算??匆幌滦翸athOps分類的接口部分。#import"Fraction.h"@interfaceFraction-(Fraction*addFraction* -(Fraction*mul:Fraction* -(Fraction*subFraction* -(Fraction*divFraction* //#inport"Fraction 可以在一個實現文件中定義Fraction.h接口部分中的所有方法,以及MathOps分類中的所有方法。的分類。與接口部分一樣,通過將分類名稱括在類名稱之后的圓括號中來確定方法所屬的分類,如下所示:@implementation //codeforcategory…C 協(xié)議,則必須實現名為myProtocolMethod的方法。通過在@interface行的一對尖括號<...>內列出協(xié)議名稱,可以告知編譯器你正在采用一個協(xié)議。這項@interfaceAddressBook: AddressBook是父類為AddressBook的對象,并且它遵守myProtocolMethod協(xié)議。在AddressBook的實現部分,編譯望找到定義的myProtocolMethod方法。@interfaceAddressBook:NSObject<myProtocol,yourProtocol>AddressBookmyProtocolMethod和yourProtocolMethod協(xié)議。這次,編譯器將期望在AddressBook的實現部分看到為這些協(xié)議列出的所有方法的實現。B、協(xié)議不任何類,它是無類的(classless。任何類都可以遵守某項協(xié)議 這告知編譯器currentObject將包含遵守Drawing協(xié)議的對象。如果向currentObject指派靜態(tài)類型的對象,這個對象Drawing協(xié)議,編譯器將給出warning。idcurrentObjectid變量,不會產生這條消息,因為編譯器不知道存儲在id變量中的對象是否遵守Drawing協(xié)議。 <Drawing,Drawing1> Drawing3DDrawingDrawing3D協(xié)議的類都必須實現此協(xié)議列出的方法,以及Drawing協(xié)議的方法。 Fraction <NSCopying,此處,Fraction擁有一個分類stuff,這個分類采用了NSCopyingNSCoding說明:“Objective-C編程可以使用與C綁定的所有工具,例如標準C庫函數??梢允褂煤蚮ree()函數處理動態(tài)內存管理問題,或者使用open(),read(),write(),fopen()和fread()函數處理文件。”屬性列表類包括NSArray、NSDictionary、NSString、NSNumber、NSDate和NSData。NSDate是用于處理日期和時間的基礎類??梢允褂肹NSDatedate];獲取當前的日期和時間,它是一個NSDate*date=[NSDatedata];NSLog(todis@”date); 還可以獲取與當前時間相隔一定時差的日期。例如,24小時之間的確切日期NSDate*yesterday=[NSDatedateWithTimeIntervalSinceNow:-(24*60*60)];NSLog(trdais@”yesterday); +dateWithTimeIntervalSinceNow:接受一個NSTimeInterval參數,該參數是一個雙精度值,表示以秒為NSData類包裝了大量字節(jié)。我們可以獲得數據的長度和指向字節(jié)起始位置的指針。下面的NSData對象將保存一個普通的C字符串(一個字節(jié)序列constchar*string=“there,thisisaCtngNSData*data=[NSDatadataWithBytes:stringlength:strlen(string)+1];NSogdaais @”data);datais 0x48H,0x69i,等等。strlen(string)+1中的“+1C字符串所需的尾部的零字節(jié)(輸出結果尾的00)。NSLog@”%bytesstringis‘s”,[datalength],[data//-length方法給出字節(jié)數-bytes方法給出指向字符串起始位置的指針30bytesstringisHthere,thisisaCstring!NSData對象是不可改變的,它們被創(chuàng)建后就不能改變。NSMutableData支持在數據內容中添加和刪除集合屬性列表類(NSArray、NSDictionary)具有一個-writeToFileatomically:方法,用于將屬性列表寫入文件。NSString和NSData也具有writeToFileatomicallyNSArrayphrase=[NSArrayarrayWithObjects:@I””m”@t”@b”@”@vb”nil]; p/gxt <?xmlron10”nodingU8<!DOCTYPEplistPUBLIC“-//Apple//DTDPLIST10//E <pliston<string>I<string<string>seem<string<string>to<string<string>be<string<string>a<string<string>verb<string現在已經將verbiage.txt文件保存在了磁盤上,可以使用+arrayWithContentsOfFile:方法該文件。NSArray*phrase2=[NSArray arrayWithContentsOfFile:@”/t/rbigetxtNSLog%@”phrase2);()writeToFile:方法中的atomically:參數的值為BOOL類型,用于通知是否應該首先將文件保存在臨時第十一章對//XYPoint類@interfaceXYPoint:NSObject{int}@propertyintx, //XYPoint類定義#import"XYPoint.h"@implementationXYPoint@synthesizex,y;{x=xVal;y=}//Rectangle類@class@interfaceRectangle:{intwidth;intXYPoint}@propertyintwidth, //-(XYPoint*)-(void)setOrigin:(XYPoint*)-(void)setWidth:(int)wandHeight:(int)-(int)//Rectangle類定義#import"Rectangle.h"@implementationRectangle@synthesizewidth,height;-(void)setWidth:(int)wandHeight:(int){width=w;height=}-(void)setOrigin:(XYPoint*){origin=}{returnwidth*}-(int){return(width+height)*}-(XYPoint*){return}#import"XYPoint.h"intmain(intargc,char{NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];Rectangle*myRect=[[Rectanglealloc]init];[myRectsetWidth:5andHeight:8];XYPoint*myPoint=[[XYPointalloc]init];[myPointsetX:100andY:200];myRect.origin=myPoint; NSLog@"Originati%imyRect.origin.xmyRect.origin.y);[myPointsetX:50andY:50];NSLog(@"Originat(%i,%i)",myRect.origin.x,myRect.origin.y);[myRectrelease];[pooldrain];return0;} 這樣賦值的結果僅僅是將對象myPoint的地址到myRect.origin中。在賦值操作結束時,兩個變量是NSMutableArray對象,那么語句 #import<Foundation/NSObject.h>#import<Foundation/NSArrayh>#import<Foundation/NSString#import<Foundation/NSAutoreleasePoolh>intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];NSMutableArray*dataArray=[NSMutableArrayarrayWithObjects:@"one",@"two",@"three",@"four",nil];NSMutableArray*dataArray2;dataArray2=[dataArray2removeObjectAtIndex:0];NSLog(@"dataArray:");for(NSString*elemindataArray)NSLog(@"%@",elem);NSLog(@"dataArray2:for(NSString*elemindataArray2)NSLog(@"%@",elem); //下面開始dataArray2=[dataArraymutableCopy];[dataArray2removeObjectAtIndex:0];NSLog(@"dataArray:");for(NSString*elemindataArray)NSLog(@"%@",elem);NSLog(@"dataArray2:for(NSString*elemindataArray2)NSLog(@"%@",elem); [dataArray2release];[pooldrain];return}copy利用名為copy和mutableCopy的方法,可以創(chuàng)建對象的副?NSMutableArray對象dataArray和dataArray2,語句dataArray2=[dataArrayremoveObjectAtIndex:0];刪除了dataArray2中的第一個元素,但是不會刪除dataArray中的。B、在產生數組的副?時,數組中每個元素的保持計數將通過操作自動增1。所以,需要[dataArray2release];釋放它的內存。淺和#import<Foundation/NSObject.h>#import<Foundation/NSArrayh>#import<Foundation/NSString#import<Foundation/NSAutoreleasePoolh>intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];NSMutableArray*dataArray=[NSMutableArrayarrayWithObjects:[NSMutableStringstringWithstring:@"one"],[NSMutableStringstringWithstring:@"two"],[NSMutableStringstringWithstring:@"three"],NSMutableArray*dataArray2;NSMutableString*mStr;NSLog(@"dataArray:");for(NSString*elemindataArray)NSLog(@"%@",elem); dataArray2=[dataArraymStr=[dataArrayobjectAtIndex: [mStrappendString:@"ONE"]; NSLog(@"dataArray:");for(NSString*elemindataArray)NSLog(@"%@",elem);NSLog(@"dataArray2:for(NSString*elemindataArray2)NSLog(@"%@",elem); [dataArray2release];[pooldrain];return}dataArray的第一元素發(fā)生改變:從集合中獲取元素時,得到了這個元素的一個新,但并不是一個新副?。所以,對dataArray調用objectAtIndex:方法時,返回的對象與dataArray中的第一個元素都指向內存中的同一個對象。隨后,修改string對象的mStr的副作用就是同時改變了dataArray的第一個元素。dataArray2的第一元素發(fā)生改變:這與默認的淺方式有關。使用mutableCopy方法數組時,在內存中為新的數組對象分配了空間,并且將單個元素到新數組中。但是,這僅僅是將一個數組的元素到另一個數組。那么,這兩個數組中的每個元素指向內存中的同一個字符串。這與將一個對象容的副?dataArray2dataArray的第一個元素,可以創(chuàng)建一個新字符串,并將它到dataArray2的第一個位置,如下所示:mStr= objectAtIndex:0]: N replaceObjectAtIndex: withObject:這樣,替換數組中的對象后,mStrdataArray2的第一個元素仍指向內存中的同一個對象。這意味著隨后在程序中對mStr做的修改也將更改數組的第一個元素。 若對象是NSString、NSDictionary、NSArray、NSData、NSNumber對象時,可以使用參數atomically為YES,表示先將數據寫到臨時備份文件中,一旦成功,再轉移到文件中。#import<Foundation/NSObject.h>#import<Foundation/NSString.h>##import<Foundation/NSAutoreleasePool.h>intmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];NSDictionary*glossary1= dictionaryWithObjectsAndKeys@"Aclassdefinedsootherclassescaninhert",@" @"Toimplementallthemethoddefinedinaprotocol",@"adopt",@"Storinganobjectforlateruse",@"archiving",if([glossarywriteToFile:@"glossary "atomically:YES]==NO)NSLog(@"Savetofilefailed!");NSDictionary*glossary2=[NSDictionarydictionaryWithContentOfFile:"glossary"];for(NSString*keyinglossary2)[pooldrain]; 0}glossary文件里保存的數據格式是<key>...</key><要讀回數據使用dataWithContentOfFile要讀回字符串對象使用stringWithContentOfFile注:屬性列表可以來自任何的源,可以來自文?編輯器或者PropertyListEditorNSKeyedArchiver使用NSKeyedArchiver類創(chuàng)建帶鍵的,在帶鍵的中,每個歸檔的字段都有一個名稱。歸檔某NSKeyedArchiver類中的archiveRootObject:toFile:方法將數據對象到磁盤上。NSDictionary*glossary=[NSKeyedArchiverarchiveRootObject:glossary通過NSKeyedUnarchiver類中的unArchiveObjectWithFile:方法將創(chuàng)建的歸檔文件讀入執(zhí)行的程序中。NSDictionary*glossary=[NSKeyedUnar
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030合金市場發(fā)展分析及行業(yè)投資戰(zhàn)略研究報告
- 2025-2030半結晶聚鄰苯二甲酰胺行業(yè)市場現狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030化學表面處理行業(yè)市場現狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030動態(tài)心電圖儀行業(yè)市場現狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 加工木門合同樣本
- 2025-2030減肥食品行業(yè)市場發(fā)展分析與發(fā)展前景及投資戰(zhàn)略研究報告
- 2025-2030農村網絡零售產業(yè)市場深度調研及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025-2030獸醫(yī)補充行業(yè)市場現狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030共享辦公行業(yè)現狀與發(fā)展趨勢及投資前景預測報告
- 2025-2030全球核材料市場發(fā)展格局及投資戰(zhàn)略規(guī)劃策略研究報告
- 課題申報書:醫(yī)學院校研究生“導學思政”創(chuàng)新實踐路徑研究
- 2025年游泳教練資格認證考試理論試題集(初級)
- 2025年國企山東濟南公共交通集團有限公司招聘筆試參考題庫附帶答案詳解
- 高二入團考試試題及答案
- 福建省漳州市醫(yī)院招聘工作人員真題2024
- 湖北省圓創(chuàng)教育教研中心2025屆高三三月聯合測評物理試題及答案
- 科室醫(yī)療質量管理小組職責
- 陳倉《我有一棵樹》閱讀答案
- 銅絞線接地施工方案
- 2025年開封大學單招職業(yè)適應性測試題庫新版
- 【WGSN】2025秋冬歐洲站童裝趨勢洞察
評論
0/150
提交評論