анализатор и проблемы с авторекламой с пользовательскими объектами

У меня есть класс, который управляет запросами базы данных для моего проекта, и у меня возникают некоторые проблемы с управлением памятью и частью кода [return autorelease] . Я не знаю, как вернуть объект в вызывающую функцию, но потом использует ее. Код выглядит так:

-(Hexagram *)getHexagramforId:(NSInteger)hexagramNumber{
    Hexagram *current;
    if (init_statement == nil) {
        const char * sql = "SELECT * FROM HEXNUMBER where _id =?";
    if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error:failed to prepare argument with message %s", sqlite3_errmsg(database));
    }
    sqlite3_bind_int(init_statement, 1, hexagramNumber);
    if (sqlite3_step(init_statement) == SQLITE_ROW) {
        current = [[Hexagram alloc]initWithId:hexagramNumber
                                             Title:[NSString stringWithUTF8String:(char*)sqlite3_column_text(init_statement, HEX_TITLE)]
                                               LongText:[NSString stringWithUTF8String:(char*)sqlite3_column_text(init_statement, HEX_TEXT)]ShortText:nil InternalColor:sqlite3_column_int(init_statement, INTERNAL_COLOR) ExternalColor:sqlite3_column_int(init_statement, EXTERNAL_COLOR)];

    }else{
        NSAssert1(0, @"Database is corrupt, error %s", sqlite3_errmsg(database));
    }
    sqlite3_reset(init_statement);
    sqlite3_close(database);
    init_statement = nil;
    return current;
}
return nil;

}

So what happens is in the analyzer it says that the object current hexagram is leaked, but if I return it with an autorelease it crashes. I want to support iOS < 5 so I don't want to use ARC but so far I don't know how to return this object and not get this error in the static analyzer. Any help please?

0
nl ja de
Обратите внимание, что вы можете использовать ARC ниже iOS 5, но у вас нет слабых указателей, доступных для вас, у вас есть только unsafe_unretained для несильных типов.
добавлено автор WDUK, источник
Обратите внимание, что вы можете использовать ARC ниже iOS 5, но у вас нет слабых указателей, доступных для вас, у вас есть только unsafe_unretained для несильных типов.
добавлено автор WDUK, источник
Обратите внимание, что вы можете использовать ARC ниже iOS 5, но у вас нет слабых указателей, доступных для вас, у вас есть только unsafe_unretained для несильных типов.
добавлено автор WDUK, источник
Вы используете ARC в настоящем коде?
добавлено автор suvi, источник
Вы используете ARC в настоящем коде?
добавлено автор suvi, источник
Вы используете ARC в настоящем коде?
добавлено автор suvi, источник
Вы используете ARC в настоящем коде?
добавлено автор suvi, источник

3 ответы

Во-первых, причина, по которой аналитик жалуется, состоит в том, что вы создаете объект Hexagram через alloc] init и возвращаете его так, что означает, что ваш объект начнет работать с сохранением количества 1. Если ваши имена методов не начинаются с new/alloc/copy, пользователь кода (и статического анализатора) будет ожидать автореализованного объекта. (См. документация о соглашениях об именах + управление памятью </а>).

Что касается autorelease; Автореферат даст объекту значение удержания 1 (так что он может немного повиснуть), но будет выпущен в конце цикла запуска. Это приведет к удержанию счета 0, и объект будет освобожден.

Теперь почему return [current autorelease] не работает? Причина будет заключаться в вызове метода getHexagramforId . Если кто-то вызывает метод, который возвращает объект с автореализацией (метод, который не начинается с new/alloc/copy и т. Д.), Тогда является их ответственностью , чтобы сохранить этот объект, когда он (по указанным выше причинам).

Например, если вы изменили return current на return [current autorelease] и вызвали метод следующим образом:

Hexagram* obj = [[SomeClass getHexagramforId:3] retain];

ваша программа не должна терпеть крах. Вы явно сохраняете автореализованный объект, так что теперь вы можете поддерживать этот объект, пока он вам больше не понадобится. В этот момент вызовите [obj release] .

Другие способы сохранения автореализованного объекта включают в себя назначение его сохраняющему свойству следующим образом:

@property (nonatomic, retain) Hexagram* hexObj;

self.hexObj = [SomeClass getHexagramForId:3];

0
добавлено
так есть ли альтернатива делу alloc] init? он должен быть похож на метод класса в классе гексаграммы?
добавлено автор Andres Bucci, источник
Вы отложите alloc] init ; каждый объект создается с помощью alloc] init в какой-то момент своей жизни, но чтобы отвлечь это, некоторые люди создают методы класса, чтобы возвращать автореализованные версии. Например, [NSString stringWithString: @ "..."] - это автореализованная версия [NSString alloc] initWithString: @ "..."] . Автореализованная версия будет return [[[[NSString alloc] initWithString: @ "..."] autorelease];
добавлено автор WDUK, источник
Таким образом, метод, который я описываю в моем ответе, является наилучшим способом. Создание Hexagram через alloc] init полностью прекрасное и убедитесь, что вы вернули его версию с автореализацией. Затем, независимо от используемого возвращаемого объекта, убедитесь, что они сохраняют его.
добавлено автор WDUK, источник

Во-первых, причина, по которой аналитик жалуется, состоит в том, что вы создаете объект Hexagram через alloc] init и возвращаете его так, что означает, что ваш объект начнет работать с сохранением количества 1. Если ваши имена методов не начинаются с new/alloc/copy, пользователь кода (и статического анализатора) будет ожидать автореализованного объекта. (См. документация о соглашениях об именах + управление памятью </а>).

Что касается autorelease; Автореферат даст объекту значение удержания 1 (так что он может немного повиснуть), но будет выпущен в конце цикла запуска. Это приведет к удержанию счета 0, и объект будет освобожден.

Теперь почему return [current autorelease] не работает? Причина будет заключаться в вызове метода getHexagramforId . Если кто-то вызывает метод, который возвращает объект с автореализацией (метод, который не начинается с new/alloc/copy и т. Д.), Тогда является их ответственностью , чтобы сохранить этот объект, когда он (по указанным выше причинам).

Например, если вы изменили return current на return [current autorelease] и вызвали метод следующим образом:

Hexagram* obj = [[SomeClass getHexagramforId:3] retain];

ваша программа не должна терпеть крах. Вы явно сохраняете автореализованный объект, так что теперь вы можете поддерживать этот объект, пока он вам больше не понадобится. В этот момент вызовите [obj release] .

Другие способы сохранения автореализованного объекта включают в себя назначение его сохраняющему свойству следующим образом:

@property (nonatomic, retain) Hexagram* hexObj;

self.hexObj = [SomeClass getHexagramForId:3];

0
добавлено
так есть ли альтернатива делу alloc] init? он должен быть похож на метод класса в классе гексаграммы?
добавлено автор Andres Bucci, источник
Вы отложите alloc] init ; каждый объект создается с помощью alloc] init в какой-то момент своей жизни, но чтобы отвлечь это, некоторые люди создают методы класса, чтобы возвращать автореализованные версии. Например, [NSString stringWithString: @ "..."] - это автореализованная версия [NSString alloc] initWithString: @ "..."] . Автореализованная версия будет return [[[[NSString alloc] initWithString: @ "..."] autorelease];
добавлено автор WDUK, источник
Таким образом, метод, который я описываю в моем ответе, является наилучшим способом. Создание Hexagram через alloc] init полностью прекрасное и убедитесь, что вы вернули его версию с автореализацией. Затем, независимо от используемого возвращаемого объекта, убедитесь, что они сохраняют его.
добавлено автор WDUK, источник

Во-первых, причина, по которой аналитик жалуется, состоит в том, что вы создаете объект Hexagram через alloc] init и возвращаете его так, что означает, что ваш объект начнет работать с сохранением количества 1. Если ваши имена методов не начинаются с new/alloc/copy, пользователь кода (и статического анализатора) будет ожидать автореализованного объекта. (См. документация о соглашениях об именах + управление памятью </а>).

Что касается autorelease; Автореферат даст объекту значение удержания 1 (так что он может немного повиснуть), но будет выпущен в конце цикла запуска. Это приведет к удержанию счета 0, и объект будет освобожден.

Теперь почему return [current autorelease] не работает? Причина будет заключаться в вызове метода getHexagramforId . Если кто-то вызывает метод, который возвращает объект с автореализацией (метод, который не начинается с new/alloc/copy и т. Д.), Тогда является их ответственностью , чтобы сохранить этот объект, когда он (по указанным выше причинам).

Например, если вы изменили return current на return [current autorelease] и вызвали метод следующим образом:

Hexagram* obj = [[SomeClass getHexagramforId:3] retain];

ваша программа не должна терпеть крах. Вы явно сохраняете автореализованный объект, так что теперь вы можете поддерживать этот объект, пока он вам больше не понадобится. В этот момент вызовите [obj release] .

Другие способы сохранения автореализованного объекта включают в себя назначение его сохраняющему свойству следующим образом:

@property (nonatomic, retain) Hexagram* hexObj;

self.hexObj = [SomeClass getHexagramForId:3];

0
добавлено
так есть ли альтернатива делу alloc] init? он должен быть похож на метод класса в классе гексаграммы?
добавлено автор Andres Bucci, источник
Вы отложите alloc] init ; каждый объект создается с помощью alloc] init в какой-то момент своей жизни, но чтобы отвлечь это, некоторые люди создают методы класса, чтобы возвращать автореализованные версии. Например, [NSString stringWithString: @ "..."] - это автореализованная версия [NSString alloc] initWithString: @ "..."] . Автореализованная версия будет return [[[[NSString alloc] initWithString: @ "..."] autorelease];
добавлено автор WDUK, источник
Таким образом, метод, который я описываю в моем ответе, является наилучшим способом. Создание Hexagram через alloc] init полностью прекрасное и убедитесь, что вы вернули его версию с автореализацией. Затем, независимо от используемого возвращаемого объекта, убедитесь, что они сохраняют его.
добавлено автор WDUK, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)