Управление памятью, все должно быть ясно
Мне нужно прояснить ситуацию с управлением памятью в Objective-C:
Если я объявлю объект в заголовке класса как ivar без @property:
@interface MyFacebooDelegate : UIViewController
{
TableViewController *tableController;
}
...
@end
а некоторые где в коде например в - (void)viewDidLoad
Я делаю:
tableController = [[TableViewController alloc] init];
так, где лучший способ выпустить это. Что если я сделаю мгновенный объект свойством, что будет другим? и как управление памятью тоже будет
@interface MyFacebooDelegate : UIViewController
{
TableViewController *tableController;
}
...
@end
@property (nonatomic, strong) TableViewController *tableController;
Что следующий синтаксис делает именно для объекта viewController:
.час
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) ViewController *viewController;
@end
.m
@implementation AppDelegate
@synthesize window = _window;
@synthesize viewController = _viewController;
- (void)dealloc
{
[_window release];
[_viewController release];
[super dealloc];
}
.....
@end
Если я хочу вернуть объект через метод в другой класс, нужно ли мне autorelease
это сначала в теле метода, а затем retain
это на стороне приемника? например этот метод, что именно делать в теле метода и на стороне получателя тоже:
-(NSString *)getFriendId
{
NSArray *ar = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
return [ar objectAtIndex:0];
}
Я знаю это много, но я действительно смущен и нуждаюсь в вашей помощи.
2 ответа
1) лучший способ - в диллок; или прямо перед переустановкой.
2) собственность делает сохранение / освобождение для вас. Но ВНИМАНИЕ! Вы продолжаете путать вещи. Вы используете "сильный" здесь, что относится к ARC. Если вы действительно настаиваете на использовании классического retain/release (вы не должны), используйте вместо этого (nonatomic, retain).
3) Ваши свойства освобождаются на Deloc. Опять же, сильный здесь не так.
4) Да. В идеале вы должны. Еще одна причина, почему ARC - это круто, она делает все это для вас автоматически.
tl; dr: использовать ARC. Никогда не возвращайся. (Но все же выучите ручное управление памятью)
ARC - это ответ на все ваши вопросы по управлению памятью. Очень важная записка о сильной и слабой собственности в дополнение к
Сильное свойство iOS: настолько сильное - это то же самое, что сохранить в объявлении свойства перед ARC. Для проектов ARC я бы использовал strong вместо retain, я бы использовал assign для свойств C примитива.
Выходы iOS должны быть определены как объявленные свойства. Обычно выходы должны быть слабыми, за исключением тех, которые принадлежат Владельцу файла, объектам верхнего уровня в файле пера (или, в iOS, сцене раскадровки), которые должны быть сильными. Поэтому создаваемые вами выходы обычно будут слабыми по умолчанию, поскольку: выходы, которые вы создаете, например, для подпредставлений представления контроллера представления или окна контроллера окна, являются произвольными ссылками между объектами, которые не подразумевают владение.