Прежде чем ответить на ваш вопрос, я собираюсь предложить краткое резюме нескольких соглашений Objective C:
Имена классов пишутся с заглавной буквы.
Имена переменных в CamelCased.
Методы установки принимают форму - [setFoo:]
Методы получения получают в виде - [foo]
Person *p = [[Person alloc] init];
[p setFirstName:@"Jimi"];
// or - p.firstName = @"Jimi"
// BOTH invoke the same setter method (somewhat unintuitive)
Это мое лучшее предположение; У меня нет интерфейса Person передо мной (пожалуйста, опубликуйте его). Учитывая, что вы новичок в Objective-C, я рекомендую вам временно избегать директивы @synthesize и писать свои собственные методы setter / getter. Вы лучше познакомитесь с языком, но также будете подвержены стратегиям сохранения / копирования / выпуска и потенциальным проблемам со ссылками на память (важно, чтобы вы знали, с чем сталкиваетесь;))
Как пример:
@interface Person : NSObject {
NSString *firstName;
}
- (void)setFirstName:(NSString *)s {
if (s != firstName) { // this compares memory references, _not_ string content
[firstName release];
firstName = [s retain];
}
}
- (NSString *)firstName {
return firstName;
}
В методе сеттера условие важно, потому что если по какой-то причине и ивар и параметр ссылаются на одну и ту же область памяти, то при освобождении ивара этот параметр также будет освобожден, вызывая множество проблем.
Кроме того, в своем коде в блоке else {} вы объявили переменную «name», которая «конфликтует» с параметром «name». Хотя это допустимо, любые ссылки на 'name' в блоке else {} ссылаются на локальную переменную, , а не параметр. Вы можете изменить имя одной из переменных.