Introduction
A singleton is a special kind of class where only one instance of the class exists for the current process. (In the case of an iPhone app, the one instance is shared across the entire app.) Or we can say a solution of the encapsulation problem is to create classes that manage any global data as discreet modules. This is done through a singleton.
It's an extremely powerful way to share data among various parts of code without having to pass the data around manually.
To better understand Singletons here we use an example.
In this article I will create a Single View application and use the UITableViewController class to save data in a table taken from the user. To add a table view controller class we use the followiing.
Select any one Objective-C class and right-click on it then choose new file -> select objective C class -> click on next -> Choose subclass UITableViewController from the drop down list and enter whatever class name you want. If you want to use xib then you mark on it -> click on next -> select the location where you import the view controller class in the project.
Here in the first UIView I use one button and one text field from outlet. It is a class which is used to get input from the user and show output in another view TableViewContoller.
Now we create a simple project to understand the Singleton Pattern.
Step 1
Open XCode by double-clicking on it.
Step 2
Create a New XCode Project by clicking on it.
Step 3
Now select a Single View Application and click on Next.
Step 4
Now provide your Product Name. Here I use TableView and Company Identifier Mcn Solutions and click on Next.
Step 5
Select the location where you want to save your project and click on Create.
Step 6
Select ViewController.Xib class and right-click on it.
Choose New File..
Step 7
Select the Objective-C class.
Step 8
Select Subclass of UITableViewController from the drop down list and provide it the name ExampleDataViewController and click on the checkbox with xib to use the interface.
Click on Next.
Step 9
As it is we add one more Objective-C Class NSObject type.
Step 10
Now To use the Singleton Pattern we use the following code:
Singleclass.h
#import <Foundation/Foundation.h>
@interface Singletonclass : NSObject
{
NSMutableArray *array;
}
@property(strong,nonatomic)NSMutableArray *array;
+(Singletonclass*)sharedobject;
@end
Singleclass.m
#import "Singletonclass.h"
@implementation Singletonclass
@synthesize array;
static Singletonclass* _sharedobject=nil;
+(Singletonclass *)sharedobject
{
@synchronized([Singletonclass class])
{
if (!_sharedobject)
_sharedobject=[[self alloc] init];
return _sharedobject;
}
return nil;
}
+(id)alloc
{
@synchronized([Singletonclass class])
{
NSAssert(_sharedobject == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedobject = [super alloc];
return _sharedobject;
}
return nil;
}
-(id)init {
self = [super init];
if (self != nil) {
}
return self;
}
@end
ExampleViewController.h
//
// ExampleViewController.h
// SingletonClass
//
// Created by Sachin Bhardwaj on 14/12/12.
// Copyright (c) 2012 Sachin Bhardwaj. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ExampleViewController : UIViewController
{
IBOutlet UITextField *txt;
IBOutlet UIButton *btn;
}
@property (strong,nonatomic) IBOutlet UIButton *btn;
@property (strong,nonatomic) IBOutlet UITextField *txt;
-(IBAction) click;
-(IBAction)TextFieldReturn:(id)sender;
@end
ExampleViewController.m
//
// ExampleViewController.m
// SingletonClass
//
// Created by Sachin Bhardwaj on 14/12/12.
// Copyright (c) 2012 Sachin Bhardwaj. All rights reserved.
//
#import "ExampleViewController.h"
#import "Singletonclass.h"
#import "ExampleDataViewController.h"
@interface ExampleViewController ()
@end
@implementation ExampleViewController
@synthesize txt,btn;
-(IBAction) click
{
NSString *str = txt.text;
if([str isEqualToString:@""])
{
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:nil message:@"enter name " delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
[alertView release];
}
else {
[[Singletonclass sharedobject].array addObject:str];
ExampleDataViewController *dt = [[ExampleDataViewController alloc]init];
[self.navigationController pushViewController:dt animated:YES];
}
}
-(IBAction)TextFieldReturn:(id)sender
{
[sender resignFirstResponder];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[Singletonclass sharedobject].array = [[NSMutableArray alloc]init];
self.title = @"Input";
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
DataViewController.h
//
// ExampleDataViewController.h
// SingletonClass
//
// Created by Sachin Bhardwaj on 14/12/12.
// Copyright (c) 2012 Sachin Bhardwaj. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "Singletonclass.h"
@interface ExampleDataViewController : UITableViewController
@end
DataViewController.m
//
// ExampleDataViewController.m
// SingletonClass
//
// Created by Sachin Bhardwaj on 14/12/12.
// Copyright (c) 2012 Sachin Bhardwaj. All rights reserved.
//
#import "ExampleDataViewController.h"
@interface ExampleDataViewController ()
@end
@implementation ExampleDataViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return[[Singletonclass sharedobject].array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [[Singletonclass sharedobject].array objectAtIndex: indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
@end
Outlet Connection
Output:
Now select which Platform you want to see output for.
Output 1 in iPhone:
Here we write anything in the text field and click on button to show it on the table.
Output 2 in iPhone:
Here we write "India" and to hide the keyboard we click on the return button.
Output 3 in iPhone:
Output show on table.