Я создаю небольшое приложение для iphone и использую одиночный файл для хранения и обновления строки, которая обновляется, когда пользователь нажимает буквы или цифры на экране, чтобы сформировать код.
т.е. они нажимают 3, затем S, затем 4, и мне нужно отследить и объединить этот ввод, чтобы сказать «3S4». Когда синглтон инициализируется, он создает пустую строку NSString, а затем я использую метод stringByAppendString, чтобы добавить следующую нажатую букву / цифру. Когда я впервые попробовал это, у меня не было строки [enterCode retain], и приложение зависало с EXC_BAD_ACCESS, всегда после 2 входов. Я установил свойство NSZombie, которое сообщало мне о том, что enterCode был распределен, но я не знаю, где и как это произошло. Все, что я знаю, это то, что в конце метода addInput он сообщит, что значение retainCount будет равно 2, а затем сразу же после того, как я смогу увидеть (вызывая синглтон из другого места), оно упадет до 1 (когда строка удержания будет там ).
Мой вопрос: хотя то, что я сделал, добавив [enterCode retain], работает для меня, нарушаю ли я некоторые правила здесь или поступаю неправильно или неправильно? Я просто не понимаю, почему освобождается строка.
Я новичок в Objective-C, кстати
в MySingleton.h
@interface MySingleton : NSObject {
NSString *enteredCode;
}
в MySingleton.m
-(void) addInput:(NSString *) input
{
NSLog(@"enteredCode retain count is : %d \n ",[enteredCode retainCount]);
enteredCode = [enteredCode stringByAppendingString:input];
NSLog(@"enteredCode retain count is : %d \n ",[enteredCode retainCount]);
[enteredCode retain]; // without this the app crashes
NSLog(@"enteredCode retain count is : %d \n ",[enteredCode retainCount]);
}
-(id) init
{
self = [super init];
if (self)
{
enteredCode = @"";
}
return self;
}