Вопрос

Я читал, что неизменяемые типы данных не могут быть изменены после создания (например, NSString или NSArray).

Но можно ли их повторно инициализировать, чтобы они указывали на другой набор объектов?

Если да, то использую ли я выпуск для освобождения любого выделения памяти с первого раза между использованиями?например:

myArray объявлен как NSArray *myArray в интерфейсе и как неатомарное/сохраняемое свойство.myArray установлен в коде инициализации как точка на массив строк следующим образом.

self.myArray = [myString componentsSeparatedByString:@","];

Но позже я хочу повторно инициализировать myArray, чтобы он указывал на другой набор строк.

self.myArray = [myOtherString componentsSeparatedByString:@","];

Является ли это возможным?Спасибо...

Это было полезно?

Решение

Да, вы можете повторно инициализировать NSArray.Вот пример кода, который я использовал для повторной инициализации NSArray.

NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                  [arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;

keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                   [arr objectAtIndex:2],[arr objectAtIndex:3]);

Другие советы

Это действительно зависит от того, что вы имеете в виду под повторно инициализировать.Вы можете назначить другой неизменяемый объект в указатель, поскольку указатели не являются постоянными.

Пример:

@interface MyObj : NSObject {
    NSString *name;                    // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name;      // sane people use copy instead of retain
                                       // whenever possible. Using retain can
                                       // lead to some hard to find errors.
@end

/* ... another file ... */

MyObj *theObject = [[[MyObj alloc] init] autorelease];

theObject.name = @"Peter";
NSString *oldName = theObject.name;

NSLog(@"%@", theObject.name);   // -> Peter
NSLog(@"%@", oldName);          // -> Peter

theObject.name = @"Martin";
NSLog(@"%@", theObject.name)    // -> Martin
NSLog(@"%@", oldName)           // -> Peter

Если поведение, описанное выше, соответствует вашим ожиданиям, это нормально.

Если вы хотите, чтобы эта последняя строка вернулась Мартин ты в беде. Это постоянные строки и нет предполагалось изменить.Если вы действительно хотите, вы можете изменить память объекта напрямую, но это опасно и не рекомендуется.Используйте изменяемые объекты, если вам нужно такое поведение.

Конечно, они могут.Сказав, что NSArray является неизменяемым, не означает, что атрибут класса этого типа не может быть изменен.Вы не можете изменить содержимое, но можете назначить ему новое содержимое.

Если вы хотите сделать невозможным изменение ссылки, вам следует использовать const ключевое слово.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top