【问题标题】:Can i have a single NSMutableArray in my multiple views application?我可以在我的多视图应用程序中有一个 NSMutableArray 吗?
【发布时间】:2011-10-03 14:00:32
【问题描述】:

我有一个基于导航的应用程序,它有多个视图。是否可以为整个应用程序使用一个 NSMutableArray?我可以在一个视图中将对象添加到该 NSMutableArray 中,然后从其他视图中从同一 NSMutableArray 中删除对象吗?我试过了

 myappAppDelegate *appDelegate = (myappAppDelegate *)[[UIApplication sharedApplication] delegate];

但是当我尝试访问 appDelegate 的数组时它给了我 null。如果有人可以给我任何想法或帮助链接或教程。提前致谢。

【问题讨论】:

  • "我必须在该数组中添加和删除对象。" “那个数组”是什么意思?哪个数组? “appDelegate 的数组”是什么意思?
  • 对不起,我的错。我已经编辑了问题。
  • 按照 alinoz 的建议,您应该考虑使用单例。

标签: iphone objective-c nsmutablearray uiapplication iphone-developer-program


【解决方案1】:

如果您的应用程序中有多个视图,并且在这种情况下您希望每个视图都可以访问一个变量,您应该始终创建一个 Model/Data(singleton) 类并定义里面的变量。像这样的东西:

//DataClass.h      

@interface DataClass : NSObject {    

NSMutableArray *arrGlobal;     

}    
@property(nonatomic,retain)NSMutableArray *arrGlobal;   
+(DataClass*)getInstance;    
@end  



//DataClass.m    
@implementation DataClass    
@synthesize arrGlobal;    
static DataClass *instance =nil;    
+(DataClass *)getInstance    
{    
    @synchronized(self)    
    {    
        if(instance==nil)    
        {    

            instance= [DataClass new];    
        }    
    }    
    return instance;    
}    

现在在您的视图控制器中,您需要将此方法称为:

DataClass *obj=[DataClass getInstance];  
obj.arrGlobal = arrLocal; 

每个视图控制器都可以访问此变量。您只需要创建一个 Data 类的实例。

【讨论】:

  • 在DataClass.m中,我们是否必须释放arrGlobal?
  • 不,您不必发布它。它在应用程序结束时自行释放。
  • DataClass *obj=[DataClass getInstance]; [obj.arrGlobal addObject:self.currentRunData]; NSLog(@"obj.arrGlobal count: %d", obj.arrGlobal.count);但 obj.arrGlobal.count 始终为 0
  • 数组计数总是整数。它应该是 %i 而不是 %d。
  • 它仍然是 0。没有任何区别
【解决方案2】:

对于您的问题类型,我会使用单例。

http://en.wikipedia.org/wiki/Singleton_pattern

appdelegate 也是一个单例,但如果您使用自己的单例,您可以减少代码行数。

【讨论】:

    【解决方案3】:

    AppDelegate 方法应该可以工作,并且您可能应该弄清楚它为什么不工作,即使您使用单例也是如此。

    获取appDelegate 指针的语句似乎是正确的,所以我猜测指向数组的指针要么没有在你的myappDelegate 类中设置(并保留),要么你没有创建AppDelegate 实例首先正确。

    【讨论】:

    • 始终建议使用singleton instead of appDelegate。另请参阅this 讨论。
    • 我看到了一些自封权威的讨论。但无论如何,OP 都应该弄清楚他做错了什么,因为 AppDelegate 没有什么特别之处,而且他很可能会犯错,除非他知道自己的方式错误,否则他会在其他地方犯错。
    【解决方案4】:

    Singleton 方法上添加这个

    instance.arrGlobal = [[NSMutableArray alloc] init];
    

    这样:

    @synchronized(self)    
    {    
        if(instance==nil)    
        {    
    
            instance= [DataClass new];
            instance.arrGlobal = [[NSMutableArray alloc] init];
        }    
    }    
    return instance;
    

    这样你可以初始化数组并正确使用它。

    【讨论】:

    • 这需要更多的支持。在像您在这里所做的那样初始化全局数组之前,我无法获得上述答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多