2014-09-11 52 views
0

在下面的代码中,我尝试将新对象添加到myArray.However,但在调用doSome方法后,myArray的值仍为零,为什么?iOS中的属性值Singleton

+ (void) doSome { 
    NSMutableArray *xx = [[self sharedInstance] myArray]; 
    if (xx == nil) { 
    xx = [NSMutableArray array]; 
    } 
    [xx addObject:@"dfdsf"]; 

}

回答

1

在Objective-C中的所有对象都通过引用处理(你的变量只是存储的地址告诉他们存在于内存中的对象)。

所以分配不同的对象,以局部变量,只影响局部变量:

+ (void) doSome { 
    // xx is a local variable... you point it to the address returned 
    // by [[self sharedInstance] myArray] 
    // 
    NSMutableArray *xx = [[self sharedInstance] myArray]; 

    // It's probably nil here since the array was never created. 
    // 
    if (xx == nil) { 

    // Here, you're creating a new object and assigning that object's 
    // address to your local variable xx... this will have absolutely no 
    // effect on the return value of [[self sharedInstance] myArray] 
    // which will keep returning nil. 
    // 
    xx = [NSMutableArray array]; 
    } 
    [xx addObject:@"dfdsf"]; 
} 

有几种解决方案,您可以采用。其中之一就是为你的阵列使用一个懒惰的初始化器,像这样:

// Add this property to your class 
@property (nonatomic, strong) NSMutableArray* myArray; 

+ (void) doSome { 
    NSMutableArray *xx = [[self sharedInstance] myArray]; 

    [xx addObject:@"dfdsf"]; 
} 

- (NSMutableArray*)myArray 
{ 
    if (!_myArray) 
    { 
     _myArray = [NSMutableArray array]; 
    } 

    return _myArray; 
} 
2

NSMutableArray *xx = [[self sharedInstance] myArray];

你有一个指向名为xx一个可变的数组。目前xx指向返回的任何对象myArray

xx = [NSMutableArray array];

这里重新分配xx指向一个新的数组。虽然xx已更改为指向新对象,但没有任何更改您的'sharedInstance object or whichever object its myArray`属性引用。为了改变存储在这个单例中的数组,你需要更新该共享实例的属性。也许是这样的:

[[self sharedInstance] setMyArray:xx];