Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
何时在objective-c中使用alloc init_Objective C_Oop_Memory Management_Allocation - Fatal编程技术网

何时在objective-c中使用alloc init

何时在objective-c中使用alloc init,objective-c,oop,memory-management,allocation,Objective C,Oop,Memory Management,Allocation,嘿,伙计们,我有一个简单的客观c问题,我一直在查看我的公司代码库,我偶然发现了一些有趣的东西。何时应该使用[[alloc]init],何时不应该使用。下面是一个典型的例子: 案例1: NSString *url = nil; url = @"hi"; 案例2: NSString *url = [[NSString alloc] init]; url = @"hi"; 那么什么时候应该使用案例1,什么时候应该使用案例2?我希望有人能永远地为我解决这个问题,在我的应用程序开发中,我一直在使用案例

嘿,伙计们,我有一个简单的客观c问题,我一直在查看我的公司代码库,我偶然发现了一些有趣的东西。何时应该使用[[alloc]init],何时不应该使用。下面是一个典型的例子:

案例1:

NSString *url = nil;
url = @"hi";
案例2:

NSString *url = [[NSString alloc] init];
url = @"hi";

那么什么时候应该使用案例1,什么时候应该使用案例2?我希望有人能永远地为我解决这个问题,在我的应用程序开发中,我一直在使用案例2,因为我认为它相当于在C++中调用一个“新”(基本上调用一个对象构造函数)。我感到震惊的是,案例1甚至可以工作,因为案例1表明没有调用构造函数或为该对象分配内存。案例1在我看到的代码库中随处可见。

alloc
创建一个对象。因此,当您想要创建类的实例时,可以使用它。在这种情况下,您不想创建对象,因为您要将现有对象@“hi”分配给变量。因此,您永远不会编写案例2,因为它创建了一个对象,并立即为另一个对象丢弃它。

alloc
创建了一个对象。因此,当您想要创建类的实例时,可以使用它。在这种情况下,您不想创建对象,因为您要将现有对象@“hi”分配给变量。因此,您永远不会编写案例2,因为它创建了一个对象并立即为另一个对象丢弃它。

alloc
创建存储并执行一些基本的自动设置,返回类的实例
init
允许实例根据该类所需的逻辑配置自身<代码>=为指针指定不同的实例

所以第一个总是正确的,第二个总是错误的。创建一个对象的实例,然后在一行之后将其丢弃是没有意义的


(旁白:使用ARC时,您始终可以跳过所暗示的
=nil
;在您的情况下,您可以跳过它,因为以下赋值)

alloc
创建存储并执行一些基本的自动设置,返回类的实例
init
允许实例根据该类所需的逻辑配置自身<代码>=为指针指定不同的实例

所以第一个总是正确的,第二个总是错误的。创建一个对象的实例,然后在一行之后将其丢弃是没有意义的

(旁白:使用ARC时,您始终可以跳过隐含的
=nil
;在您的情况下,您可以跳过它,因为以下赋值)

@“hi”创建NSString的实例。它执行分配和初始化。因此,在案例2中,您无意义地分配内存,然后将“url”指针重新分配给新的内存块

你必须记住“url”是一个指针。就像在C或C++中,当你使用“=”操作符时,你重新分配它指向的位置,你不会影响它指向的内存。在C语言中,如果要更改存储在新分配内存中的值,则必须使用解引用运算符。

@“hi”创建NSString的实例。它执行分配和初始化。因此,在案例2中,您无意义地分配内存,然后将“url”指针重新分配给新的内存块


你必须记住“url”是一个指针。就像在C或C++中,当你使用“=”操作符时,你重新分配它指向的位置,你不会影响它指向的内存。在C中,如果要改变在新分配的内存中存储的值,则必须使用Debug引用操作符。< /P>避免将C++机制应用到Objule.C.Objc不提供与C++不同的运算符重载,因此Objc对象的操作(如内部值赋值)总是通过与该类相关联的方法来完成的,不要使用'>代码'>操作符,也不要使用<代码> [[…OLC] in]代码>你可以使用<代码>……/Cube >,但这是相同的,但是在第一个例子中你可以避免将C++机制应用到Objule.C Objc不像C++那样不提供操作符重载,所以对Objc对象(如内部值赋值)进行操作。始终通过与该类关联的方法完成,而不是使用“=”运算符。也可以使用
[…alloc]init]
而不是使用
[…new]
,这是相同的,但在第一步中,您可以自定义有趣的字符串,因此看起来字符串在目标c中是特例?没有字符串不是特例。Objective-C有几个助手(称为文字)可以更简洁地创建基本对象@“hi”扩展为分配和创建字符串。还有一个用于数组的文本:@[object1,object2,object3],还有一个用于字典的文本:@{@“key1”:object1,@“key2”:object2}。这些文字只是为了更简洁的代码。但是,NSString、NSArray和NSDictionary是普通对象。@AyBayBay:常量字符串实际上是一种特例。它们是不朽的对象(至少在我熟悉的实现中)存在于二进制文件的数据部分,并且是统一的,因此同一翻译单元中的相同字符串常量实际上是相同的字符串。但从内存管理语义的角度来看,它们并不特别。你应该能够像对待任何其他字符串一样对待它们,因为你的大多数程序都不知道一个值是否是字符串常量。@Chuck这是真的,我认为内存中常量的位置与这个问题无关,我认为它混淆了这个问题。从字符串文本返回的对象在任何方面都不是“特殊”的,即使它在技术上没有每次为字符串分配内存。这很有趣,所以看起来字符串在目标c中是特例?没有字符串不是特例。Objective-C有几个h