Другой метод создания - PullRequest
0 голосов
/ 02 мая 2011

В чем разница между этим:

AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];

bookmarkObject *bookmark = (bookmarkObject *)[appDelegate.bookmarks objectAtIndex:i];

И

   AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];

    bookmarkObject *bookmark = [[bookmarkObject alloc]init];
    bookmark = [appDelegate.bookmarks objectAtIndex:i];

Это большая проблема, если я не понимаю?Оба работают, но я не понимаю разницу

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Последняя утечка памяти.ObjectAtIndex возвращает автоматически освобожденный объект.Во втором примере вы теряете память, выделенную alloc.

Первый правильный.Если вы обсуждаете создание экземпляров, то обычно есть три метода, один, например, [NSArray alloc] init], другой [NSArray array], который является ярлыком для [[NSArray alloc] init] autorelease] и [arrayкопия], которая создает копию.Во всех случаях, кроме автоматически выпущенных, вы должны освободить память самостоятельно.Objective-C построен вокруг проходящих указателей.Поэтому, если есть какой-то метод, который возвращает указатель, вам не нужно ничего выделять или инициализировать.И общее эмпирическое правило: кто бы ни выделял память, он должен отвечать за освобождение, либо он должен быть автоматически освобожден.

0 голосов
/ 02 мая 2011

Ну, они будут работать одинаково, более или менее, поскольку ваш второй пример содержит назначение (bookmark = [[bookmarkObject alloc] init]), которое немедленно отменяется вторым назначением (mookmark = [appDelegate.bookmarks objectAtIndex:i];).

Второй утечка памяти, однако.

...