2014-09-11 3 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 изменился, чтобы указать на новый объект, ничего не изменилось. Свойство myArray` ссылается на свойство sharedInstance object or whichever object its. Чтобы изменить массив, хранящийся в этом одноэлементном, вам нужно будет обновить свойство для этого общего экземпляра. Может быть, с чем-то вроде:

[[self sharedInstance] setMyArray:xx];

Смежные вопросы