Singleton

Best way of singleton in Objective-C

It’s very useful during iOS development

static GeneralData __strong *generalDataObject = nil;

@synthesize currentUser;

+(GeneralData *) getInstance
{
static dispatch_once_t pred;
dispatch_once(&pred, ^{
generalDataObject = [self new];
});
return generalDataObject;
}

Usage

  1. Add Data

    firstViewController.m
    #import "GeneralData.h";

    - (IBAction) passValueButton:(id)sender {
    {
    User *user = [User new];
    user.name = "Mary Jane";
    user.age = "21";
    [GeneralData sharedInstance].currentUser = user;
    }
  2. Read Data

    secondViewController.m
    #import "GeneralData.h";

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    User *loggedInUser = [GeneralData sharedInstance].currentUser;
    NSLog(@"Name : %@", loggedInUser.name);
    NSLog(@"Age : %@", loggedInUser.age);

    }

Reference : StackOverflow

在ViewController 之間傳值

在iOS的開發中,我們經常會使用ViewController來控制每一個畫面的行為,
剛開始的時候最常遇到的問題就是

“怎麼在兩個ViewController之間傳遞資訊”這篇文章中我列出了幾種常見的方法,提供給大家做參考。

1. 透過實體(Instance)傳遞資訊

我們都知道,每一個ViewController 的類別(Class),不管是用Storyboard還是Nib的方式,都要先初始化(alloc + init),然後再透過這些實體(Instance)物件做操作。所以,要在彼此之間傳遞資訊,必須要取得這些實體

如果傳遞的資訊比較簡單,或是傳遞資訊的動作只有一次的時候,透過物件的實體是比較簡單的方式

範例A: 透過 Nib 的方式,取得ViewController2 的實體,傳遞資訊,指定user的值

- (IBAction)passValueButton:(id)sender { //An action method
{
User *user = [[User alloc] init];
user.name = "Ryan";
user.age = "26";
//get the instance of ViewController2
ViewController2 *viewCtrl2 = [[SecondViewController alloc]
initWithNibName:@"ViewController2" bundle:[NSBundle mainBundle]];
viewCtrl2.user = user;
[self presentModalViewController:viewCtrl2 animated:YES];//Go to view 2
}

範例B:在StoryBoard中,透過Segue 取得的實體,傳遞資訊,指定user的值

- (IBAction)passValueButton:(id)sender { //An action method
[self performSegueWithIdentifier:@"gotoView2" sender:self];
}
#pragma mark handle segue
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"gotoView2"]) {
User *user = [[User alloc] init];
user.name = "Ryan";
user.age = "26";
ViewController2* viewCtrl2 = segue.destinationViewController;
//the destination is View 2
viewCtrl2.user = user;
}
}
**2.透過單例(Singleton)物件傳遞** 透過物件的實體來傳遞固然很方便,但是很多時候,資訊的共享並不只存在於兩個ViewController之間,例如這個應用程式的作者資訊、目前登入者的暫存資料等等,應該是在一個共通的地方,每個人都是去同一個地方存取共通的資訊。這時我們就可以透過Singleton的方式,讓資訊傳遞更簡單。
[![](http://3.bp.blogspot.com/-_ivnC4oFHjU/UGvy1U3Z79I/AAAAAAAACUM/3HjhOjMIaxg/s640/blog2.png)](http://3.bp.blogspot.com/-_ivnC4oFHjU/UGvy1U3Z79I/AAAAAAAACUM/3HjhOjMIaxg/s1600/blog2.png)
以下是範例程式碼
+(GeneralData *) sharedInstance;
@property (nonatomic) User *user;
view raw GeneralData.h hosted with ❤ by GitHub
static GeneralData __strong *generalDataObject = nil;
@synthesize user;
+(GeneralData *) sharedInstance
{
static dispatch_once_t pred;
dispatch_once(&pred, ^{
generalDataObject = [[self alloc]init];
});
return generalDataObject;
}
//Singleton Reference : http://goo.gl/1KBHH
view raw GeneralData.m hosted with ❤ by GitHub
#import "GeneralData.h";
- (IBAction)passValueButton:(id)sender { //An action method
{
User *user = [[User alloc] init];
user.name = "Ryan";
user.age = "26";
[GeneralData sharedInstance].user = user;
}
#import "GeneralData.h";
- (void)viewDidLoad
{
[super viewDidLoad];
User *currentUser = [GeneralData sharedInstance].user;
NSLog(@"Name : %@", currentUser.name);
NSLog(@"Age : %@", currentUser.age);
}