Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.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 为什么创建变量而不是直接赋值?_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 为什么创建变量而不是直接赋值?

Iphone 为什么创建变量而不是直接赋值?,iphone,objective-c,ios,Iphone,Objective C,Ios,这是一个基本的问题,我真的不确定要搜索什么,看看以前是否有人问过 在许多示例中,我看到物业转让是这样处理的: NSArray *tempArray = [/*some code to get array*/]; self.propertyArray = tempArray; [tempArray release]; 为什么不干脆做: self.propertyArray = [/*some code to get array*/]; 这两者有什么区别 在第二个示例中,您没有释放由属性保留的对

这是一个基本的问题,我真的不确定要搜索什么,看看以前是否有人问过

在许多示例中,我看到物业转让是这样处理的:

NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];
为什么不干脆做:

self.propertyArray = [/*some code to get array*/];

这两者有什么区别

在第二个示例中,您没有释放由属性保留的对象,因此存在内存泄漏

self.propertyArray = [[SomeClass alloc] init];
//                               ^ no release

在第二个示例中,不释放由属性保留的对象,因此存在内存泄漏

self.propertyArray = [[SomeClass alloc] init];
//                               ^ no release

您的第一个示例是在自动引用计数(ARC)出现之前的工作方式。第二个示例在ARC下运行良好。除非你必须用老式的方法,否则为你的所有项目选择ARC。

你的第一个例子是自动引用计数(ARC)出现之前的方法。第二个示例在ARC下运行良好。除非你必须用老式的方法来做,否则为你的所有项目选择ARC。

这样的代码很可能意味着有人希望能够更容易地调试它。基本上,如果您有一个单独的变量,您可以在调试器中打印它,而无需触发(可能是自定义的)属性设置器和获取器。

这样的代码很可能意味着有人希望能够更轻松地调试它。基本上,如果您有一个单独的变量,您可以在调试器中打印出来,而无需触发(可能是自定义的)属性setter和getter。

对于ARC,这两个语句在实践中是等效的(尽管您必须省略发布调用,才能在ARC中实际编译)

在手动管理内存场景中,第二个示例(“直接赋值”,这不是因为您调用的是属性设置程序,而不是设置ivar)会泄漏tempArray,因为您没有对tempArray的释放调用来平衡它的alloc/init


有用的区别在于表达能力、调试能力以及程序员的个人偏好

对于ARC,这两条语句在实践中是等价的(尽管您必须省略发布调用,才能在ARC中实际编译)

在手动管理内存场景中,第二个示例(“直接赋值”,这不是因为您调用的是属性设置程序,而不是设置ivar)会泄漏tempArray,因为您没有对tempArray的释放调用来平衡它的alloc/init


有用的区别在于表达能力、调试能力以及程序员的个人偏好

这个答案是假设您不使用ARC

第一个代码片段是Apple建议初始化属性的方式,只要您在init之外的任何方法中都这样做。你会注意到苹果的代码片段经常这样做。它使你更容易管理你的记忆,在我看来,它使阅读更容易

NSArray *tempArray = [[NSArray alloc] initWith....]
self.propertyArray = tempArray;
[tempArray release];
您拥有的第二个代码片段可能导致内存泄漏,具体取决于您如何设置NSArray

这将是一个漏洞。propertyArray的保留计数为2。在dealloc中释放实例变量后,retain计数仍然为1。那是个漏洞

self.propertyArray = [[NSArray alloc] initWith...];
这没关系,因为它们都是自动释放的,这会给你一个保留计数1。只要您在dealloc中释放实例变量

// Class Method so autoreleased
self.propertyArray = [NSArray arrayWith....];

// Explicitly declaring autorelease
self.propertyArray = [[[NSArray alloc] initWith.....] autorelease];
这只是偏好的问题。我更喜欢第一种方式,我认为它更容易阅读和遵循

编辑(带圆弧):

除了发布声明和自动释放声明之外,所有这些方法都是可以接受的

[tempArray release];
ARC自动为您管理内存,所以您不必显式地释放它们。这就是ARC的好处,您可以创建任意多的对象,而无需费劲地想办法在何处释放它们

而且,你的财产也会有所不同。你必须使用强项或弱项,而不是保留。在这种情况下,strong将是解决方案

@property (nonatomic, strong) NSArray *tempArray;

这个答案是假设您不使用ARC

第一个代码片段是Apple建议初始化属性的方式,只要您在init之外的任何方法中都这样做。你会注意到苹果的代码片段经常这样做。它使你更容易管理你的记忆,在我看来,它使阅读更容易

NSArray *tempArray = [[NSArray alloc] initWith....]
self.propertyArray = tempArray;
[tempArray release];
您拥有的第二个代码片段可能导致内存泄漏,具体取决于您如何设置NSArray

这将是一个漏洞。propertyArray的保留计数为2。在dealloc中释放实例变量后,retain计数仍然为1。那是个漏洞

self.propertyArray = [[NSArray alloc] initWith...];
这没关系,因为它们都是自动释放的,这会给你一个保留计数1。只要您在dealloc中释放实例变量

// Class Method so autoreleased
self.propertyArray = [NSArray arrayWith....];

// Explicitly declaring autorelease
self.propertyArray = [[[NSArray alloc] initWith.....] autorelease];
这只是偏好的问题。我更喜欢第一种方式,我认为它更容易阅读和遵循

编辑(带圆弧):

除了发布声明和自动释放声明之外,所有这些方法都是可以接受的

[tempArray release];
ARC自动为您管理内存,所以您不必显式地释放它们。这就是ARC的好处,您可以创建任意多的对象,而无需费劲地想办法在何处释放它们

而且,你的财产也会有所不同。你必须使用强项或弱项,而不是保留。在这种情况下,strong将是解决方案

@property (nonatomic, strong) NSArray *tempArray;

去读这篇文章,它可能会帮助你->[1]:可能会重复阅读这篇文章,它可能会帮助你->[1]:如果你
[[SomeClass alloc]init]autorelease]
,可能会重复显然不是。或者只使用ARC,它负责为您释放和自动释放,在这种情况下,您也不会有任何泄漏。(就个人而言,我不明白为什么有人会有一个新项目而不使用ARC。)你不一定会有内存泄漏,你的