Причина, по которой
NoteDate = [[df dateFromString: [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]] retain];
хорошо, потому что вы сохраняете переменную. Поскольку вы не выделяете строку, а вызываете stringWithUTF8String
для NSString
, вы не вступаете во владение переменной, и поэтому возвращаемая вами строка автоматически освобождается. Однако, поскольку вы сохраняете его, это не вызывает проблем.
Если переменные возвращаются автоматически освобожденными, то они освобождаются при сливе пула автоматического выпуска, который происходит в конце каждого события (подробнее см. пули автоматического выпуска ). Это не хорошо с переменной экземпляра, потому что она должна остаться после текущего события.
Когда вы назначаете переменную с помощью:
NoteText = [NSString stringWithUTF8String: columnText];
Ваш метод установки не вызывается, поэтому возвращаемая строка (которая, опять же, автоматически высвобождается) не сохраняется и поэтому освобождается пулом автоматического выпуска в конце события.
Называя его так:
self.NoteText = [NSString stringWithUTF8String: columnText];
действительно сохраняет строку, так как строка является другим способом записи:
[self setNoteText:[NSString stringWithUTF8String: columnText]];
, который вызывает ваш метод установки и сохраняет переменную, предотвращая ее освобождение в конце текущего события.