Цель C / iPhone: возможно ли повторно инициализировать NSArray? - PullRequest
1 голос
/ 12 января 2010

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

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

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

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

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

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

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

Возможно ли это? Спасибо ...

Ответы [ 3 ]

2 голосов
/ 12 января 2010

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

Пример:

@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

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

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

0 голосов
/ 12 января 2010

Да, вы можете переинициализировать 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]);
0 голосов
/ 12 января 2010

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

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

...