Помимо проблемы управления памятью, знаете ли вы, что вы переопределили функцию установки для свойства word
?
Когда вы @synthesize
свое свойство word, методы setter и getter генерируются позадисцены, так что уже есть функции для - (void)setWord:(NSString *)aWord;
и - (NSString *)word;
. Вы можете прочитать об этом в учебнике Objective-C или Документация языка программирования .
Поскольку вы создали функцию (void)setWord:(NSString *)aWord;
, она переопределяет созданный установщик.Поскольку вы на самом деле не устанавливаете переменную word
, ваше свойство «сломано».
Например, возможно, переписать его как:
#import "Word.h"
@implementation Word
@synthesize word, wordArray;
- (void)setWord:(NSString *)aWord {
// set the word iVar
if (aWord != word) {
[aWord retain]; // I prefer [aWord copy];
[word release];
word = aWord;
}
NSMutableArray *newValue = [[NSMutableArray alloc] init];
for (int i = 0 ;i < [aWord length] ;i++) {
NSString *character = [NSString stringWithFormat:@"%C",[aWord characterAtIndex:i]];
[wordArray addObject:character];
}
// Now that you have created the newArray, set it to the property
self.wordArray = newValue;
[newValue release];
}
- (void)dealloc {
[word release];
[wordArray release];
[super dealloc];
}
@end
Редактировать
Почему я написал, что предпочел [aWord copy]
над [aWord retain]
?Потому что я бы объявил свойства как copy
, а не retain
.
Изменчивость может быть болью.Предположим, что вместо передачи NSString*
в aWord
каким-то образом передается NSMutableString*
.Это возможно, потому что NSMutableString
является подклассом NSString
.Предположим также, что другая часть программы изменила значение этой строки (в конце концов, оно изменяемое ).Теперь мы изменили свойство класса Word внешне.Это нарушает инкапсуляцию.
Имеет смысл использовать @property (copy)…
для классов коллекций.
Хороший ответ вы можете прочитать здесь .