• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            攀升·Uranus


            Something Different,Something New
            數據加載中……

            iOS寫文件補充

            一 系統內置對象讀寫至文件

            - If your objects are of type NSString,NSDictionary,NSArray,NSDate,NSData, or NSNumber, you can use the writeToFile:atomically: method implemented in these classes to write your data to a file. In the case of writing out a dictionary or an array, this method writes the data to the file in the format of an XML property list. Program 19.1 shows how the dictionary you created as a simple glossary in Chapter 15,“Numbers, Strings, and Collections,” can be written to a file as a property list.

             Program 19.1

            #import <Foundation/NSObject.h>

            #import <Foundation/NSString.h>

            #import <Foundation/NSDictionary.h>

            #import <Foundation/NSAutoreleasePool.h>

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

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

               {

                            NSAutoreleasePool            * pool = [[NSAutoreleasePool alloc] init];

                            NSDictionary       *glossary =

                            [NSDictionary        dictionaryWithObjectsAndKeys:

                                @”A class defined so other classes can inherit from it.”, @”abstract class”,

                                @”To implement all the methods defined in a protocol”, @”adopt”,

                                @”Storing an object for later use. “,  @”archiving”,

                                nil

                            ];

                            if ([glossary writeToFile: @”glossary”                  atomically: YES] == NO)

                                NSLog (@”Save to file failed!”);

                            [pool drain];

                            return 0;

                       }


            To read an XML property list from a file into your program, you use the dictionaryWithContentsOfFile: or arrayWithContentsOfFile: methods.To read back data, use the dataWithContentsOfFile: method; to read back string objects, use the stringWithContentsOfFile:method. Program 19.2 reads back the glossary written in Program 19.1 and then displays its contents.  


            #import <Foundation/NSObject.h> 

            #import <Foundation/NSString.h> 

            #import <Foundation/NSDictionary.h> 

            #import <Foundation/NSEnumerator.h> 

            #import <Foundation/NSAutoreleasePool.h> 


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

                NSAutoreleasePool  * pool = [[NSAutoreleasePool alloc] init]; 

                NSDictionary *glossary; 


                glossary = [NSDictionary dictionaryWithContentsOfFile: @”glossary”]; 


                for ( NSString *key in glossary ) 

                    NSLog (@”%@: %@”,          key, [glossary objectForKey: key]); 


                 [pool drain]; 

                return 0; 

             二 自定義對象讀寫至文件

             -   A more flexible approach enables you to save any type of objects to a file, not just strings, arrays, and dictionaries.This is done by creating a keyed archive using the NSKeyedArchiver class.
            This implies that you can’t directly archive your AddressBook using this technique because the Objective-C system doesn’t know how to archive an AddressBook object. If you tried to archive it by inserting a line such as NSKeyedArchiver archiveRootObject: myAddressBook toFile: @”addrbook.arch”]; into your program, you’d get the following message displayed if you ran the program:

            *** -[AddressBook encodeWithCoder:]: selector not recognized
            *** Uncaught exception: <NSInvalidArgumentException>
            *** -[AddressBook encodeWithCoder:]: selector not recognized
            archiveTest: received signal: Trace/BPT trap
            To archive objects other than those listed, you must tell the system how to archive, or encode, your objects, and also how to unarchive, or decode, them.This is done by adding encodeWithCoder: and initWithCoder: methods to your class definitions, according to the <NSCoding> protocol. For our address book example, you’d have to add these methods to both the AddressBook and AddressCard classes.

            The encodeWithCoder: method is invoked each time the archiver wants to encode an object from the specified class, and the method tells it how to do so. In a similar manner, the initWithCoder: method is invoked each time an object from the specified class is to be decoded.

            Program 19.5 Addresscard.h Interface File
            #import <Foundation/NSObject.h>
            #import <Foundation/NSString.h>
            #import <Foundation/NSKeyedArchiver.h>
            @interface AddressCard: NSObject <NSCoding, NSCopying>
            {
            NSString  *name;
            NSString  *email;
            }
            @property (copy, nonatomic) NSString *name, *email;
            -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail;
            -(NSComparisonResult) compareNames: (id) element;
            -(void) print;
            // Additional methods for NSCopying protocol
            -(AddressCard *) copyWithZone: (NSZone *) zone;
            -(void) retainName: (NSString *) theName andEmail: (NSString *) theEmail;

            @end

            -(void) encodeWithCoder: (NSCoder *) encoder
            {
            [encoder encodeObject: name forKey: @”AddressCardName”];
            [encoder encodeObject: email forKey: @”AddressCardEmail”];
            }
            -(id) initWithCoder: (NSCoder *) decoder
            {
            name = [[decoder decodeObjectforKey: @”AddressCardName”] retain];
            email = [[decoder decodeObjectforKey: @”AddressCardEmail”] retain];
            return self;
            }

            #import “AddressBook.h”
            #import <Foundation/NSAu orelea ePool.h>
            int main (int argc, char *argv[])
            {
             NSString  *aName = @”Julia Kochan”;
            NSString  *aEmail = @”jewls337@axlc.com”;
            NSString  *bName = @”Tony Iannino”;
            NSString  *bEmail = @”tony.iannino@techfitness.com”;
            NSString  *cName = @”Stephen Kochan”;
            NSString  *cEmail = @”steve@steve_kochan.com”;
            NSString  *dName = @”Jamie Baker”;
            NSString  *dEmail = @”jbaker@hitmail.com”;
            NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
            AddressCard *card1 = [[AddressCard alloc] init];
            AddressCard *card2 = [[AddressCard alloc] init];
            AddressCard *card3 = [[AddressCard alloc] init];
            AddressCard *card4 = [[AddressCard alloc] init];
            AddressBook  *myBook = [AddressBook alloc];
            // First set up four address cards
            [card1 setName: aName andEmail: aEmail];
            [card2 setName: bName andEmail: bEmail];
            [card3 setName: cName andEmail: cEmail];
            [card4 setName: dName andEmail: dEmail];
            myBook = [myBook initWithName: @”Steve’s Address Book”];
            // Add some cards to the address book
            [myBook addCard: card1];
            [myBook addCard: card2];
            [myBook addCard: card3];
            [myBook addCard: card4];
            [myBook sort];
            if ([NSKeyedArchiver archiveRootObject: myBook toFile: @”addrbook.arch”] == NO)
            NSLog (@”archiving failed”);
            [card1 release];
            [card2 release];
            [card3 release];
            [card4 release];
            [myBook release];
            [pool drain];
            return 0;
            }

            Program 19.7 shows how you can read the archive into memory to set up the address
            book from a file.
            Program 19.7
            #import “AddressBook.h”
            #import <Foundation/NSAutoreleasePool.h>
            int main (int argc, char *argv[])
            {
            AddressBook         *myBook;
            NSAutoreleasePool   * pool = [[NSAutoreleasePool alloc] init];
            myBook = [NSKeyedUnarchiver unarchiveObjectWithFile: @”addrbook.arch”];
            [myBook list];
            [pool drain];
            return 0;
            }

            三 使用NSData讀寫文件

            - You might not want to write your object directly to a file using the archiveRootObject:ToFile: method, as was done in the previous program examples.For example, perhaps you want to collect some or all of your objects and store them in a single archive file.You can do this in Objective-C using the general data stream object class called NSData.

            int main (int argc, char *argv[])
            {
            NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
            Foo               *myFoo1 = [[Foo alloc] init];
            Foo               *myFoo2;
            NSMutableData     *dataArea;
            NSKeyedArchiver   *archiver;
            AddressBook       *myBook;
            // Insert code from Program 19.7 to create an Address Book
            // in myBook containing four address cards
            [myFoo1 setStrVal: @”This is the string”];
            [myFoo1 setIntVal: 12345];
            [myFoo1 setFloatVal: 98.6];
            // Set up a data area and connect it to an NSKeyedArchiver object
            dataArea = [NSMutableData data];
            archiver = [[NSKeyedArchiver alloc]
            initForWritingWithMutableData: dataArea];
            // Now we can begin to archive objects
            [archiver encodeObject: myBook forKey: @”myaddrbook”];
            [archiver encodeObject: myFoo1 forKey: @”myfoo1”];
            [archiver finishEncoding];
            // Write the archived data are to a file
            if ( [dataArea writeToFile: @”myArchive” atomically: YES] == NO)
            NSLog (@”Archiving failed!”);
            [archiver release];
            [myFoo1 release];
            [pool drain];
            return 0;
            }

            - Restoring the data from your archive file is simple:You just do things in reverse. First, you need to allocate a data area like before.Next, you need to read your archive file into the data area; then you have to create an SKeyedUnarchiver object and tell it to decode data from the specified area.You must invoke decode methods to extract and decode your archived objects.When you’re finished, you send a finishDecoding message to the NSKeyedUnarchiver object.

            #import <Foundation/NSObject.h>
            #import <Foundation/NSAutoreleasePool.h>
            #import <Foundation/NSString.h>
            #import <Foundation/NSKeyedArchiver.h>
            #import <Foundation/NSCoder.h>
            #import <Foundation/NSData.h>
            #import “AddressBook.h”
            #import “Foo.h”
            int main (int argc, char *argv[])
            {
            NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
            NSData            *dataArea;
            NSKeyedUnarchiver *unarchiver;
            Foo               *myFoo1;
            AddressBook       *myBook;
            // Read in the archive and connect an
            // NSKeyedUnarchiver object to it
            dataArea = [NSData dataWithContentsOfFile: @”myArchive”];
            if (! dataArea) {
            NSLog (@“Can’t read back archive file!”);
            Return (1);
            }
            unarchiver = [[NSKeyedUnarchiver alloc]
            initForReadingWithData: dataArea];
            // Decode the objects we previously stored in the archive
            myBook = [unarchiver decodeObjectForKey: @”myaddrbook”];
            myFoo1 = [unarchiver decodeObjectForKey: @”myfoo1”];
            [unarchiver finishDecoding];
            [unarchiver release];
            // Verify that the restore was successful
            [myBook list];
            NSLog (“%@\n%i\n%g”, [myFoo1 strVal],
            [myFoo1 intVal], [myFoo1 floatVal]);
            [pool release];
            return 0;
            }

            參考:Programming.in.Objective-C.2.0.2nd(Addison.Wesley.2009)

            posted on 2011-03-09 17:51 攀升 閱讀(863) 評論(0)  編輯 收藏 引用 所屬分類: iOS

            漂亮人妻被黑人久久精品| 久久精品水蜜桃av综合天堂 | 久久久亚洲欧洲日产国码二区| 69国产成人综合久久精品| 久久强奷乱码老熟女网站| 久久夜色精品国产噜噜噜亚洲AV| 99久久亚洲综合精品成人| 久久精品人人做人人爽电影| 国产福利电影一区二区三区,免费久久久久久久精 | 久久精品国产第一区二区| 精品少妇人妻av无码久久| 亚洲国产婷婷香蕉久久久久久| 青青青青久久精品国产h| 久久人与动人物a级毛片| 久久精品国产一区二区三区不卡| 国产美女久久精品香蕉69| 精品综合久久久久久98| 久久久久亚洲?V成人无码| 久久久91精品国产一区二区三区 | 51久久夜色精品国产| 久久综合给合久久狠狠狠97色69| 久久99精品国产99久久6| 久久久久久久久波多野高潮| 久久强奷乱码老熟女| 久久久久四虎国产精品| 久久亚洲中文字幕精品有坂深雪| 2019久久久高清456| 一级a性色生活片久久无少妇一级婬片免费放| 国产精品久久久久久福利69堂| 蜜臀av性久久久久蜜臀aⅴ| 亚洲女久久久噜噜噜熟女| 无码八A片人妻少妇久久| 无码人妻久久一区二区三区蜜桃| 久久人人爽人爽人人爽av| 久久亚洲AV无码西西人体| 久久精品国产一区二区三区不卡| 久久性精品| 久久精品国产亚洲AV久| 97精品依人久久久大香线蕉97| 无遮挡粉嫩小泬久久久久久久| 久久影院综合精品|