2014-01-16 3 views
-1

Я пытаюсь передать объект с помощью Singleton, но когда я его распечатаю в новом ViewController, он дает мне (null). Когда i NSLog optionsSingle в Viewcontroller1, он распечатывает объект.Singleton Return (null)

Viewcontroller1.h

@interface PrivateViewController : UIViewController<UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate> 
{ 
    rowNumber *optionsSingle; 
} 

Viewcontroller1.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    optionsSingle = [rowNumber singleObj]; 
    optionsSingle = [devices objectAtIndex:indexPath.row];  
} 

Viewcontroller2.h

@interface SelectVideo : UITableViewController<NSFetchedResultsControllerDelegate> 
{ 
    rowNumber *optionsSingle; 
} 

Viewcontroller2.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    optionsSingle=[rowNumber singleObj]; 
    NSLog(@"%@", [NSString stringWithFormat:@"%@", optionsSingle.selectedRowNow]); 
} 

row.h

@interface rowNumber : NSObject 
{ 
    NSMutableArray *selectedRowNow; 
} 

@property (nonatomic) NSMutableArray *selectedRowNow; 

+(rowNumber *)singleObj; 

@end 

row.m

@implementation rowNumber 
{ 
    rowNumber *anotherSingle; 
} 

@synthesize selectedRowNow; 

+(rowNumber *)singleObj 
{ 
    static rowNumber * single=nil; 
    @synchronized(self) { 
     if(!single) { 
      single = [[rowNumber alloc] init]; 
     } 
    } 
return single; 
} 

@end 
+2

По названиям классов классов начинаются с заглавной буквы. Имена файлов класса такие же, как имя класса, где это возможно. Это предотвращает путаницу и позволяет другим более легко понять другие коды. – zaph

+1

Я сомневаюсь, что это использование синглета является оправданным. В основном Singletons следует использовать очень экономно, а не только для передачи значения между объектами. – zaph

ответ

1

Вы должны создать синглтон так:

static id shared_ = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    shared_ = [[[self class] alloc] init]; 
}); 
return shared_; 

Также в viewController1.m:

optionsSingle = [rowNumber singleObj]; 
optionsSingle = [devices objectAtIndex:indexPath.row]; 

второй линь e делает первую линию бесполезной.

Вы также пытаетесь зарегистрировать что-то, что по внешнему виду вы никогда не создаете или не устанавливаете. Я не вижу, где вы на самом деле устанавливаете 'selectedRowNow' - вы должны переопределить метод init в классе rowNumber для создания изменяемого массива 'selectedRowNow'.

+0

Вам не нужно '[self class]', просто 'self'. В методе класса 'self' является классом. –

-1

Вы создадите синглтон как этот простой способ

в вас .h файл записи данный пыльник код

@interface MySingleton : NSObject { 
    NSMutableArray *selectedRowNow; 
} 
+(MySingleton *)sharedInstance; 

следующий шаг в .m файл написать пыльник код

@implementation MySingleton 
static MySingleton *sharedInstance = nil; 

+ (MySingleton *)sharedInstance { 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [[MySingleton alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 
+ (id)allocWithZone:(NSZone *)zone { 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [super allocWithZone:zone]; 
      return sharedInstance; 
     } 
    } 
    return nil; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 
- (id)init { 
    if ((self = [super init])) { 
} 
    return self; 
} 

После этого вы можете определить этот следующий код в файле .pch или постоянном файле для уменьшения кода

#define AppSingleton [MySingleton sharedInstance] 

затем называют как

AppSingleton = [devices objectAtIndex:indexPath.row]; 

С Днем Coding !!!

+0

Это излишество, и в настоящее время лучше всего использовать 'dispatch_once'. – zaph