Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Objective-C中这两种分配内存的方法有什么区别?_Iphone_Objective C_Ios_Memory Management - Fatal编程技术网

Iphone Objective-C中这两种分配内存的方法有什么区别?

Iphone Objective-C中这两种分配内存的方法有什么区别?,iphone,objective-c,ios,memory-management,Iphone,Objective C,Ios,Memory Management,我对Objective-C中分配内存的正确方法感到困惑。假设我有一个NSMutableDictionary。有两种方法可以初始化它: NSMutableDictionary *alpha = [[NSMutableDictionary alloc] init]; 或 他们之间有什么区别?我知道第一个为alpha分配内存,但是第二个呢 以下哪项建议作为分配内存的最佳实践?[NSMutableDictionary]是NSMutableDictionary类上的类方法。它包含对alloc和in

我对Objective-C中分配内存的正确方法感到困惑。假设我有一个NSMutableDictionary。有两种方法可以初始化它:

   NSMutableDictionary *alpha = [[NSMutableDictionary alloc] init];

他们之间有什么区别?我知道第一个为alpha分配内存,但是第二个呢


以下哪项建议作为分配内存的最佳实践?

[NSMutableDictionary]
NSMutableDictionary
类上的类方法。它包含对
alloc
init
的调用,就像手动操作一样。由于这是一个非常常用的类,它的作者加入了这个所谓的“工厂方法”,以使他/她的类的用户的生活更轻松

有关此模式的更多详细信息,请参阅

至于哪一种是好的做法,我想你应该使用工厂方法。它使您自己的代码更具可读性,并节省您键入的时间。此外,尽管我不确定
NSMutableDictionary
是否存在这种情况,但使用工厂方法可以使其开发人员和您自己的维护更加容易,因为他们都是e。G您可以自由更改工厂提供的具体子类实现,而无需更改应用程序代码


正如注释中正确指出的那样,像这样的工厂方法返回对象的自动释放实例,因此,如果您只在方法中本地使用它们,那么从内存管理的角度来看,就不需要担心它们。有关内存管理、自动释放和具有自动引用计数功能的新ARC运行时的更多详细信息,如果您还没有深入了解苹果的相关文档,请参阅

[NSMutableDictionary]
NSMutableDictionary
类上的类方法。它包含对
alloc
init
的调用,就像手动操作一样。由于这是一个非常常用的类,它的作者加入了这个所谓的“工厂方法”,以使他/她的类的用户的生活更轻松

有关此模式的更多详细信息,请参阅

至于哪一种是好的做法,我想你应该使用工厂方法。它使您自己的代码更具可读性,并节省您键入的时间。此外,尽管我不确定
NSMutableDictionary
是否存在这种情况,但使用工厂方法可以使其开发人员和您自己的维护更加容易,因为他们都是e。G您可以自由更改工厂提供的具体子类实现,而无需更改应用程序代码


正如注释中正确指出的那样,像这样的工厂方法返回对象的自动释放实例,因此,如果您只在方法中本地使用它们,那么从内存管理的角度来看,就不需要担心它们。有关内存管理、自动释放和具有自动引用计数功能的新ARC运行时的更多详细信息,如果您还没有深入了解苹果的相关文档,请参阅

两行将为alpha分配内存,区别在于第二行alpha是自动释放对象。

两行将为alpha分配内存,区别在于第二行alpha是自动释放对象

[NSMutableDictionary dictionary];
与以下内容完全相同:

[[[NSMutableDictionary alloc] init] autorelease];
这只会帮你省下打字的时间。使用哪一个并不重要,只要知道保留对象和自动释放对象之间的区别。如果您使用的是ARC,那么您甚至不需要知道这一点

公约是:

  • 如果看到initnewcopy:它是一个保留对象
  • 如果方法名以类名(无框架前缀)开头,则它是一个自动删除的对象
  • 与以下内容完全相同:

    [[[NSMutableDictionary alloc] init] autorelease];
    
    这只会帮你省下打字的时间。使用哪一个并不重要,只要知道保留对象和自动释放对象之间的区别。如果您使用的是ARC,那么您甚至不需要知道这一点

    公约是:

  • 如果看到initnewcopy:它是一个保留对象
  • 如果方法名以类名(无框架前缀)开头,则它是一个自动删除的对象

  • 您忽略了两者之间的关键区别,
    dictionary
    返回一个自动释放的对象,而
    alloc/init
    不返回。哦,非常好的一点。已经在“弧形思维”中了。我要补充一点。@daniel那么你的意思是说两者都是一样的。除了自动释放外。很可能它们是一样的,但对于自动释放来说。然而,这一点的美妙之处在于你不必在意。将来,苹果可能会改变工厂方法的实现,以返回不同的、更高效的实现,例如基于您的应用程序当前运行的硬件。这一切都隐藏在幕后™ 它不会对99.9%的用例造成任何问题。只有在非常特殊的情况下,例如。G在每次迭代中创建新的自动释放实例的多次迭代的紧密循环可能会出现问题。然而,我强烈建议你要么a)在继续之前,如果你真的想知道所有事情,那么就深入研究iOS/ObjC内存模型文档,要么b)不用担心,使用工厂方法(苹果通常也推荐这种方法),不要再担心它,直到可能(!)在将来的某个时候,您会发现一个特定的问题案例,它不会被建议。您错过了这两者之间的关键区别,
    dictionary
    返回一个自动释放的对象,而
    alloc/init
    不返回。哦,非常好的一点。已经在“弧形思维”中了。我要补充一点。@daniel那么你的意思是说两者都是一样的。除了自动释放外。很可能它们是一样的,但对于自动释放来说。然而,这一点的美妙之处在于你不必在意。未来