ОК, здесь есть несколько недоразумений.
Вам не нужно брать mutableCopy
недавно созданного NSMutableArray
, чтобы сделать его изменчивым.Это уже изменчиво - ключ в названии.Это нужно делать в установщике только в том случае, если вы хотите, чтобы свойство имело семантику copy
(которую вы установили и, конечно, для этого могут быть веские причины).Но вам определенно не нужно было бы делать это, как показано в обновленном коде updateTitle
, и при этом просачивается localList
.
Также вы смешиваете доступ к свойству через self.list
и прямое использование.list
в том же методе.Это не является недействительным, но это плохая практика, потому что это означает, что все, что делают методы доступа, случайно обходит.Обычно свойства, подобные этим, делают все через self
, за исключением в самих средствах доступа, или в dealloc
, и, возможно, в init
(мнения по этому поводу расходятся), где вы могли бы получить доступнепосредственно к ивару.
Кроме того, никогда не звоните [self.list release]
- средство доступа к собственности не дает владения вызывающей стороне.Делая это, вы закончите слезами, запомните мои слова.
Ничто из этого не дает ответа на реальный вопрос, вот почему ваши изменения исчезают.Исходный код updateTitle
, насколько я вижу, не объясняет этого - он должен работать.Поэтому я подозреваю, что где-то еще вы звоните self.list = theOriginalList
и, следовательно, отменяете ваши изменения.
Обновление:
Просто ради аргумента, я собираюсьнапишите, что я думаю, что код, который вы разместили, вероятно, означал , чтобы выглядеть.Я сохранил ваше использование строки для передачи индекса в updateTitle
, но я хотел бы отметить, что делать это таким образом неправильно .Это число, вы должны передать его как таковое.Даже если номер взят из текстового поля или чего-то еще, это вызывает беспокойство вызывающего абонента;интерфейс класса должен указывать число.Точно так же очевидное изменение от 1 на основе индексации на основе 0.Пожалуйста, не делайте этого неявно, это рецепт для слез и скрежета зубов.
ClassA.h:
#import <Cocoa/Cocoa.h>
@interface ClassA : NSObject
{
NSMutableArray* list;
}
- (void) setList:(NSMutableArray*)newList;
- (void) updateTitle:(NSString*)newTitle forIndex:(NSString*)theIndex;
@property (nonatomic, copy, readwrite) NSMutableArray* list;
@end
ClassA.m:
#import "ClassA.h"
@implementation ClassA
@synthesize list;
- (id) init
{
if ( self = [super init] )
{
list = [[NSMutableArray alloc] init];
[list addObject:@"Hello "];
[list addObject:@"World"];
}
return self;
}
- (void) setList:(NSMutableArray*) newList
{
if ( list != newList )
{
[list release];
list = [newList mutableCopy];
}
}
- (void) updateTitle:(NSString*)newTitle forIndex:(NSString*)theIndex
{
int i = [theIndex intValue] - 1;
[self.list replaceObjectAtIndex:i withObject:newTitle];
}
- (void) dealloc
{
[list release];
[super dealloc];
}
@end
Это устраняет различные проблемы, но обратите внимание, что updateTitle
в основном одинаковы.Если вы бросите все это, и изменения все еще не сохранятся, вы определенно сбрасываете list
куда-то.