Будет ли это причиной строки, выделенной в
метод init это утечка памяти? поскольку
на строку не ссылаются и не
autoreleased.
Да, именно так. Вы, кажется, получили это.
Если я не выделю строку в init
метод, что будет, когда я позвоню
ait.string прямо перед назначением
еще одна строка?
Вы имеете в виду, что в следующем случае вы не уверены, на что ссылается unknownObject?: -
It *ait = [[It allow] init];
NSString *unknownObject = ait.string;
Это чепуха. Вы забыли добавить методы доступа?
Objective-c не использует точечный синтаксис для доступа к переменным экземпляра, как, скажем, Java. Если у вас есть экземпляр вашего класса 'it', вы можете получить доступ к переменной '1013' * string только из этого экземпляра , вызвав метод доступа getter. Это не является обязательным. Self.string является просто ярлыком для вызова метода [self string], и этот метод не существует в показанном вами коде.
При условии, что метод доступа определен в другом месте, переменная экземпляра, которую вы назвали string ( это худшее в мире имя переменной) равна nil . В Objective-c вы должны очень аккуратно обращаться с ноль объектами, поскольку поведение отличается от того, как многие другие языки относятся к аналогичному null .
В Objective-c это нормально:
NSString *nilString = nil;
[nilString writeToFile:@"/this_file_cannot_exist.data"];
Многие другие языки могут потерпеть крах здесь или вызвать исключение; Это может быть опасно, так как операция может завершиться ошибкой, но ваше приложение продолжит работу. Это также может быть здорово, потому что на других языках вы увидите много этого ..
someObject = controller.currentValue()
if( someObject!=null )
someObject.writeToFile("myFile.data")
В Objective-c строка 'if (..)' вообще не нужна.
Вы должны быть осторожны, чтобы не вызывать метод доступа внутри методов init и dealloc, так как это может нарушить подклассы. Вместо
- (void)dealloc {
[self.string release]; // This is [[self string] release]
...
Вы должны просто использовать
- (void)dealloc {
[string release];
...
Наряду с опасностью, вызов [self string] не нужен. То же самое верно в ваших методах инициализации
if(self=[super init]){
self.string = [[NSString alloc]init]; // shortcut for [self setString:[[NSString alloc] init]]
...
просто используйте
if(self=[super init]){
string = [[NSString alloc] init];
...