单身归来(null)

时间:2014-01-16 13:39:05

标签: ios objective-c

我正在尝试使用Singleton传递一个对象,但是当我在一个新的ViewController中打印它时它会给我(null)。当我在Viewcontroller1中NSLog选项时,它会打印出对象。

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 个答案:

答案 0 :(得分: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];

第二行使第一行毫无用处。

你也试图记录一些东西,从它的外观来看,你永远不会创造或设置。我无法看到你实际设置'selectedRowNow'的位置 - 你应该覆盖rowNumber类中的init方法来创建可变的'selectedRowNow'数组。

答案 1 :(得分:-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];

快乐编码!!!