Objective c 不同的实例化方法

Objective c 不同的实例化方法,objective-c,cocoa,instance,allocation,Objective C,Cocoa,Instance,Allocation,这两者之间的区别是什么: AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate]; bookmarkObject *bookmark = (bookmarkObject *)[appDelegate.bookmarks objectAtIndex:i]; 及 如果我不明白这是个大问题吗?这两种方法都能工作,但我看不出有什么不同后者会泄漏内存。objectAtIndex返回一个

这两者之间的区别是什么:

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

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


如果我不明白这是个大问题吗?这两种方法都能工作,但我看不出有什么不同

后者会泄漏内存。objectAtIndex返回一个自动释放的对象。在第二个示例中,泄漏了alloc分配的内存

正确的是第一个。如果您正在讨论实例化,那么通常有三种方法,一种是[NSArray alloc]init,另一种是[NSArray array array]——它是[[[NSArray alloc]init]autorelease]的快捷方式,[array copy]创建副本。在所有情况下,除了自动释放的,你必须自己释放内存。
Objective-C是围绕传球指针构建的。所以,若有某个方法返回指针,则不必分配或初始化任何内容。还有一条一般的经验法则——无论谁分配内存,都应该负责释放,或者必须自动释放。

好吧,它们或多或少都会起到相同的作用,因为第二个示例包含一个赋值(
bookmark=[[bookmarkObject alloc]init]
),该赋值会立即被第二个赋值推翻(
mookmark=[appDelegate.bookmarks objectAtIndex:i];


但是,第二个会泄漏内存。

所以“最好的”是第一个?非常清楚,我想我在这里学到了一些重要的东西,可能是用obj-c编程所必需的
   AppDelegate *appDelegate = (AppDelegate *)[[NSApplication sharedApplication] delegate];

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