Use a code example to summarize how data is stored in iOS application development
- 2020-05-15 02:10:15
- OfStack
The ios data store includes the following storage mechanisms:
Property list Object file SQLite3 CoreData AppSettings Common file storage
1. Property list
//
// Persistence1ViewController.h
// Persistence1
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.plist"
@interface Persistence1ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
//
// Persistence1ViewController.m
// Persistence1
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Persistence1ViewController.h"
@implementation Persistence1ViewController
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
// The full path to the data file
- (NSString *)dataFilePath {
// retrieve Documents Directory path. The first 2 Two parameters limit the search to our application sandbox
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// Each application has only 1 a Documents directory
NSString *documentsDirectory = [paths objectAtIndex:0];
// Create file name
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
// When the application exits, save the data to a property list file
- (void)applicationWillResignActive:(NSNotification *)notification {
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject: field1.text];
[array addObject: field2.text];
[array addObject: field3.text];
[array addObject: field4.text];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];
}
/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
*/
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath = [self dataFilePath];
// Check if the data file exists
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
field1.text = [array objectAtIndex:0];
field2.text = [array objectAtIndex:1];
field3.text = [array objectAtIndex:2];
field4.text = [array objectAtIndex:3];
[array release];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}
- (void)dealloc {
[field1 release];
[field2 release];
[field3 release];
[field4 release];
[super dealloc];
}
@end
2. Object archiving
//
// Fourlines.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fourlines : NSObject <NSCoding, NSCopying> {
NSString *field1;
NSString *field2;
NSString *field3;
NSString *field4;
}
@property (nonatomic, retain) NSString *field1;
@property (nonatomic, retain) NSString *field2;
@property (nonatomic, retain) NSString *field3;
@property (nonatomic, retain) NSString *field4;
@end
//
// Fourlines.m
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Fourlines.h"
#define kField1Key @"Field1"
#define kField2Key @"Field2"
#define kField3Key @"Field3"
#define kField4Key @"Field4"
@implementation Fourlines
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
#pragma mark NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:field1 forKey:kField1Key];
[aCoder encodeObject:field2 forKey:kField2Key];
[aCoder encodeObject:field3 forKey:kField3Key];
[aCoder encodeObject:field4 forKey:kField4Key];
}
-(id) initWithCoder:(NSCoder *)aDecoder {
if(self = [super init]) {
field1 = [[aDecoder decodeObjectForKey:kField1Key] retain];
field2 = [[aDecoder decodeObjectForKey:kField2Key] retain];
field3 = [[aDecoder decodeObjectForKey:kField3Key] retain];
field4 = [[aDecoder decodeObjectForKey:kField4Key] retain];
}
return self;
}
#pragma mark -
#pragma mark NSCopying
- (id) copyWithZone:(NSZone *)zone {
Fourlines *copy = [[[self class] allocWithZone: zone] init];
copy.field1 = [[self.field1 copyWithZone: zone] autorelease];
copy.field2 = [[self.field2 copyWithZone: zone] autorelease];
copy.field3 = [[self.field3 copyWithZone: zone] autorelease];
copy.field4 = [[self.field4 copyWithZone: zone] autorelease];
return copy;
}
@end
//
// Persistence2ViewController.h
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"archive"
#define kDataKey @"Data"
@interface Persistence2ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
//
// Persistence2ViewController.m
// Persistence2
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Persistence2ViewController.h"
#import "Fourlines.h"
@implementation Persistence2ViewController
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
// The full path to the data file
- (NSString *)dataFilePath {
// retrieve Documents Directory path. The first 2 Two parameters limit the search to our application sandbox
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// Each application has only 1 a Documents directory
NSString *documentsDirectory = [paths objectAtIndex:0];
// Create file name
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
// When the application exits, save the data to a property list file
- (void)applicationWillResignActive:(NSNotification *)notification {
Fourlines *fourlines = [[Fourlines alloc] init];
fourlines.field1 = field1.text;
fourlines.field2 = field2.text;
fourlines.field3 = field3.text;
fourlines.field4 = field4.text;
NSMutableData *data = [[NSMutableData alloc] init];// Used to store encoded data
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:fourlines forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];
[fourlines release];
[archiver release];
[data release];
}
/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
*/
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath = [self dataFilePath];
// Check if the data file exists
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
// Gets the data from the file for decoding
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Fourlines *fourlines = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];
field1.text = fourlines.field1;
field2.text = fourlines.field2;
field3.text = fourlines.field3;
field4.text = fourlines.field4;
[unarchiver release];
[data release];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}
- (void)dealloc {
[field1 release];
[field2 release];
[field3 release];
[field4 release];
[super dealloc];
}
@end
3, SQLite
//
// Persistence3ViewController.h
// Persistence3
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kFilename @"data.sqlite3"
@interface Persistence3ViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
- (NSString *)dataFilePath;
- (void)applicationWillResignActive:(NSNotification *)notification;
@end
//
// Persistence3ViewController.m
// Persistence3
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Persistence3ViewController.h"
#import <sqlite3.h>
@implementation Persistence3ViewController
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
// The full path to the data file
- (NSString *)dataFilePath {
// retrieve Documents Directory path. The first 2 Two parameters limit the search to our application sandbox
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// Each application has only 1 a Documents directory
NSString *documentsDirectory = [paths objectAtIndex:0];
// Create file name
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
// When the application exits, save the data to a property list file
- (void)applicationWillResignActive:(NSNotification *)notification {
sqlite3 *database;
if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
for(int i = 1; i <= 4; i++) {
NSString *fieldname = [[NSString alloc] initWithFormat:@"field%d", i];
UITextField *field = [self valueForKey:fieldname];
[fieldname release];
char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);";
sqlite3_stmt *stmt;
// will SQL Statement compiled to sqlite internal 1 A structure (sqlite3_stmt), similar java JDBC the PreparedStatement precompiled
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
// in bind Parameter time , Argument list index from 1 start , And when you pull out the data , The column index from 0 start
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
} else {
NSAssert(0, @"Error:Failed to prepare statemen");
}
// perform SQL Text, get the results
int result = sqlite3_step(stmt);
if(result != SQLITE_DONE) {
NSAssert1(0, @"Error updating table: %d", result);
}
// The release of stmt Memory footprint (sqlite3_prepare_v2() The distribution of)
sqlite3_finalize(stmt);
}
sqlite3_close(database);
}
/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
*/
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath = [self dataFilePath];
// Check if the data file exists
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
// Open the database
sqlite3 *database;
if(sqlite3_open([filePath UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
// Create a table
char *errorMsg;
NSString *createSQL =
@"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";
if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Error creating table: %s", errorMsg);
}
// The query
NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";
sqlite3_stmt *statement;
// Set up the nByte You can speed it up
if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {// Return each 1 line
int row = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);
NSString *fieldName = [[NSString alloc] initWithFormat:@"field%d", row];
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
UITextField *field = [self valueForKey:fieldName];
field.text = fieldValue;
[fieldName release];
[fieldValue release];
}
// The release of statement Memory footprint (sqlite3_prepare() The distribution of)
sqlite3_finalize(statement);
}
sqlite3_close(database);
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}
- (void)dealloc {
[field1 release];
[field2 release];
[field3 release];
[field4 release];
[super dealloc];
}
@end
4, Core Data
//
// PersistenceViewController.h
// Persistence4
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface PersistenceViewController : UIViewController {
UITextField *filed1;
UITextField *field2;
UITextField *field3;
UITextField *field4;
}
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
@end
//
// PersistenceViewController.m
// Persistence4
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "PersistenceViewController.h"
#import "Persistence4AppDelegate.h"
@implementation PersistenceViewController
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
-(void) applicationWillResignActive:(NSNotification *)notification {
Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
for(int i = 1; i <= 4; i++) {
NSString *fieldName = [NSString stringWithFormat:@"field%d", i];
UITextField *theField = [self valueForKey:fieldName];
// Create extract request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// Create the entity description and associate it with the request
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
inManagedObjectContext:context];
[request setEntity:entityDescription];
// Set conditions for retrieving data
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
[request setPredicate:pred];
NSManagedObject *theLine = nil;
//// Check if a standard match is returned, load it if it is, or create it if it is not 1 Two new managed objects to hold the text of this field
NSArray *objects = [context executeFetchRequest:request error:&error];
if(!objects) {
NSLog(@"There was an error");
}
//if(objects.count > 0) {
// theLine = [objects objectAtIndex:0];
//} else {
// create 1 Two new managed objects to hold the text of this field
theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"
inManagedObjectContext:context];
[theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"];
[theLine setValue:theField.text forKey:@"lineText"];
//}
[request release];
}
// Notify the context to save the changes
[context save:&error];
}
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization.
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
// create 1 Entity description
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];
// create 1 Is used to extract the object
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
// Retrieve objects
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if(!objects) {
NSLog(@"There was an error!");
}
for(NSManagedObject *obj in objects) {
NSNumber *lineNum = [obj valueForKey:@"lineNum"];
NSString *lineText = [obj valueForKey:@"lineText"];
NSString *fieldName = [NSString stringWithFormat:@"field%d", [lineNum integerValue]];
UITextField *textField = [self valueForKey:fieldName];
textField.text = lineText;
}
[request release];
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations.
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}
- (void)dealloc {
[field1 release];
[field2 release];
[field3 release];
[field4 release];
[super dealloc];
}
@end
5, AppSettings
//
// Persistence1ViewController.m
// Persistence1
//
// Created by liu lavy on 11-10-3.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "Persistence1ViewController.h"
@implementation Persistence1ViewController
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
// The full path to the data file
- (NSString *)dataFilePath {
// retrieve Documents Directory path. The first 2 Two parameters limit the search to our application sandbox
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// Each application has only 1 a Documents directory
NSString *documentsDirectory = [paths objectAtIndex:0];
// Create file name
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
// When the application exits, save the data to a property list file
- (void)applicationWillResignActive:(NSNotification *)notification {
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject: field1.text];
[array addObject: field2.text];
[array addObject: field3.text];
[array addObject: field4.text];
[array writeToFile:[self dataFilePath] atomically:YES];
[array release];
}
/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
*/
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath = [self dataFilePath];
// Check if the data file exists
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
field1.text = [array objectAtIndex:0];
field2.text = [array objectAtIndex:1];
field3.text = [array objectAtIndex:2];
field4.text = [array objectAtIndex:3];
[array release];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:app];
[super viewDidLoad];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}
- (void)dealloc {
[field1 release];
[field2 release];
[field3 release];
[field4 release];
[super dealloc];
}
@end
0
6. Ordinary file storage
In this way, the data is saved to or read from a file by IO itself.