Управление памятью, все должно быть ясно

Мне нужно прояснить ситуацию с управлением памятью в 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, сцене раскадровки), которые должны быть сильными. Поэтому создаваемые вами выходы обычно будут слабыми по умолчанию, поскольку: выходы, которые вы создаете, например, для подпредставлений представления контроллера представления или окна контроллера окна, являются произвольными ссылками между объектами, которые не подразумевают владение.

Другие вопросы по тегам