2013-05-11 24 views
0

我有一个类名为IGMapViewController的getInstance initWithNibName前:

在我有

static IGMapViewController *instance =nil; 

+(IGMapViewController *)getInstance { 
    @synchronized(self) { 
     if (instance==nil) { 
      instance= [IGMapViewController new]; 
     } 
    } 
    return instance; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // more code 
     instance = self; 
    } 

    return self; 
} 

如果使用对象多则1类,但只在一个类中使用initWithNibName

在init方法中名为IGRouteController的类中,我使用_mapViewController = [IGMapViewController getInstance];这发生在initWithNibName在另一个类中执行之前发生。

IGRouteController我在那个方法我用的方法updateRouteList

[_mapViewController drawSuggestedRoute:suggestedRoute];

这一切都没有运行,但我看不到结果。

如果我使用:

IGMapViewController *wtf = [IGMapViewController getInstance]; 
[wtf drawSuggestedRoute:suggestedRoute]; 

然后它的工作很大。

那么是否有可能获得一个实例和init以后用一个笔尖?

+3

你想达到什么目的? – 2013-05-11 17:44:14

+0

获得某个地方的实例。initWithNib并让我得到的实例与使用initWithNib创建的实例相同。 – clankill3r 2013-05-11 21:22:18

+0

我曾与试图有这样的视图控制器单身人士的应用程序,这是不愉快的,你想要做什么? – 2013-05-12 11:10:42

回答

0

我相信我明白你在努力完成什么。你想从一个笔尖初始化你的类的单例实例。正确?

初始化您的实例时,您使用的是[IGMapViewController new],这可能不是预期的行为。这个怎么样(未经测试...)?

+ (id)sharedController 
{ 
    static dispatch_once_t pred; 
    static IGMapViewController *cSharedInstance = nil; 

    dispatch_once(&pred, ^{ 
     cSharedInstance = [[self alloc] initWithNibName:@"YourNibName" bundle:nil]; 
    }); 
    return cSharedInstance; 
} 
0

clankill3r,

你应该避免(在这个讨论中UIViewController as a singleton见注释)创造单UIViewController秒。这也被@CarlVeazey所强调。

恕我直言,你应该创建一个UIViewController每次你需要它。在这种情况下,你的视图控制器将是一个可重用的组件。当你创建一个控制器的新的实例时,只需注入(虽然属性或初始值设定项中您感兴趣的数据,在这种情况下为suggestedRoute)。

一个简单的例子可能是以下几点:

// YourViewController.h 
- (id)initWithSuggestedRoute:(id)theSuggestedRoute; 

// YourViewController.m 
- (id)initWithSuggestedRoute:(id)theSuggestedRoute 
{ 
    self = [super initWithNibName:@"YourViewController" bundle:nil]; 
    if (self) { 
     // set the internal suggested route, e.g. 
     _suggestedRoute = theSuggestedRoute; // without ARC enabled _suggestedRoute = [theSuggestedRoute retain]; 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self drawSuggestedRoute:[self suggestedRoute]]; 
} 

如需进一步信息关于UIViewController S,我真的建议由@Ole Begemann阅读两个有趣的帖子。

希望有所帮助。