【问题标题】:Unable to modify array in Singleton无法在单例中修改数组
【发布时间】:2012-01-19 22:07:37
【问题描述】:

我已经设置了一个 Singleton(在 StackOverflow 的帮助下) 但是当我尝试修改/访问数组“listOfHeadings”时,似乎没有任何变化。 我没有收到来自编译器或运行时的错误或警告。

我的 GlobalData.h 中有这个:

#import <Foundation/Foundation.h>

@interface GlobalData : NSObject {    
    NSMutableArray *listOfHeadings;
}    
@property(nonatomic,retain)NSMutableArray *listOfHeadings;
+(GlobalData*)getInstance;  
@end

这是我的 GlobalData.m:

#import "GlobalData.h"

@implementation GlobalData
@synthesize listOfHeadings;
static GlobalData *instance; 

+(GlobalData *)getInstance{    
    @synchronized(self){    
        if(!instance){    
            instance= [[GlobalData alloc] init];
            instance.listOfHeadings=[[NSMutableArray alloc]init]; //EDIT: This line added to resolve problem
        }    
    }    
    return instance;    
}    
@end

我在 AppDelegate.m 中访问单例:

#import "GlobalData.h"
...inside didFinishLaunchingWithOptions...
    GlobalData *globDat=[GlobalData getInstance];
    [globDat.listOfHeadings addObject:@"Message Settings"]; 
    NSLog(@"appdel m array test %i",[globDat.listOfHeadings count]); // prints 0!

很明显我做错了什么 - 有人可以帮助指出我的错误吗? 谢谢。

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    listOfHeadings 是否有效并已实例化?

    (注意:在 Obj-C 中,您可以在没有错误的情况下调用 nil 对象上的方法!)

    【讨论】:

    • 这不是在 GlobalData.h 文件中处理的吗?
    • 不在问题中显示的代码中。你所做的只是声明你有一个可变数组,你需要在某个地方实际分配/初始化它。
    • 知道了-我在其他线程中找到了示例代码...谢谢! stackoverflow.com/questions/6324732/…
    【解决方案2】:

    您需要具备以下条件:

    - (id)init {
        if ( (self = [super init]) ) {
            self.listOfHeadings = [NSMutableArray array];
        }
        return self;
    }
    
    - (void)dealloc {
        [listOfHeadings release];
    
        [super dealloc];
    }
    

    创建该属性只会使您的 listOfHeadings 数组可用于其他类,并确保它不会被删除。您仍然需要创建对象,这是在 init 方法中完成的。由于该属性被保留,您需要释放它(注意 - 一次不需要 self )以避免它泄漏。

    【讨论】:

    • 有人可以修复我的格式吗 - iOS 不适合缩进!
    • 知道了-我在其他线程中找到了示例代码...谢谢! stackoverflow.com/questions/6324732/…
    • 我刚刚使用另一个线程的修复程序编辑了我的原始帖子。
    • 不要分配/初始化数组 - 而是使用 [NSMutableArray 数组]; - alloc/init 保留对象,你的属性也是如此,但它只释放一次(因此泄漏),而数组创建一个由属性保留的自动释放对象,释放一次,不会泄漏。
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2021-10-23
    • 2013-01-02
    • 2022-10-23
    • 2013-10-24
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多