创建类的实例返回警告?

时间:2014-11-18 01:45:08

标签: ios objective-c

我正在学习Objective-C中的课程。我创建了一个名为" CurrencyConverter"。

的类

据我所知,在另一个文件中创建此类的实例的方法不止一种。所以在我的AppDelegate.h中,我使用变量类型" id"创建了一个实例。像这样:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{

id currencyConverter;

}

所以在我的AppDelegate.m中,我可以在没有任何警告的情况下声明它:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

currencyConverter = [[CurrencyConverter alloc] init];

return YES;

}

然而,当我像下面这样创建我的类的实例时,我收到一条警告说&#34;未使用的变量:myCC&#34;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

CurrencyConverter *myCC = [[CurrencyConverter alloc] init];

return YES;

}

请注意,我没有创建&#34; myCC&#34;的实例。在Appdelegate.h中,我只为&#34; currencyConverter&#34;做了这个。另请注意我做了

#import "CurrencyConverter.h"

在Appdelegate.m的顶部

所以我的问题是如何创建一个类实例的方法没有警告,而另一个方法呢? Aren他们在技术上都没用过吗?...

2 个答案:

答案 0 :(得分:2)

CurrencyConverter *myCC = [[CurrencyConverter alloc] init];
return YES;

上面的变量myCC local 变量。只有这种方法才能生存。但是这个方法在下一行结束,没有再提及myCC,所以创建它是没有意义的;它会出现并再次消失(这个CurrencyConverter也是如此)。

(在另一个代码中,myCC是一个实例变量,因此它的值 - 一个不同的CurrencyConverter - 在创建并分配给它后仍然存在。无论如何,Objective-C编译器永远不会抱怨未使用的实例变量,因为这个概念毫无意义。)

答案 1 :(得分:0)

您需要了解堆栈和堆,以及局部变量与实例变量。

当你调用一个方法时,在它的“{”和“}”括号之间声明的变量是LOCAL变量。它们仅存在于方法的生命周期中。这些变量在“堆栈”上声明。

将堆栈想象成一叠便条纸。当您调用方法时,处理器会在堆栈上放下一张新的空白纸,然后使用该纸张存储方法中的所有局部变量。当你到达右括号(“}”)时,方法返回,处理器将该方法的纸张从堆栈中取出并扔掉。这张纸上的任何信息都会丢失。

实际上,每次使用左大括号时,编译器都会打开一张新的空白纸张,并且您声明的所有变量都会添加到新的空白纸张中。当您到达匹配的右括号时,顶部的纸张被丢弃,并且在最内部的开口和闭合括号之间声明的任何变量都将被丢弃。一组大括号定义“局部范围”。在这些大括号内声明的任何变量仅在大括号内可见,并且仅在大括号内显示。一旦程序退出右括号,开始和结束括号之间定义的所有变量都将被丢弃。

堆栈就像那样,但计算机内存。堆栈更像是一堆空的存储空间。当计算机首次启动时,所有的小房间都是空的。有一个“堆栈指针”指向堆栈顶部的第一个空白小区(内存位置)。如果你把东西推到堆栈上,它会被存储到空的cubby中,堆栈指针会移动到下一个空的cubby。如果你从堆栈中弹出一些东西,它会从堆栈顶部的第一个非空的cubby中取出,堆栈指针会下降到指向现在为空的cubby。当您从方法返回或退出一组大括号时,编译器会记住您使用了多少堆栈空间,并弹出堆栈中存储的所有内容并将其丢弃。

实例变量不同。它们存储在堆中,堆是一块内存块,在程序的生命周期中保留。当您创建一个对象时,处理器会从堆中雕刻出一块足够大的内存块,以便为您的对象提供指向该内存的指针。然后初始化对象,将对象设置为“干净”的启动状态。如果释放一个对象,那么堆内存就会被释放。堆中的存储空间不是从上到下。它更像是先到先得。如果你创建了10个对象,然后释放了4个对象,那么堆栈内存中就会出现这些4个对象的空洞。堆积空间更像是餐厅的桌子。如果你要求一块内存,那么操作系统会在堆上寻找一块足够大(或大于)你所要求的大小的内存空间块,就像餐馆在最小的桌子上安排那些足够大的人一样。坐在整个小组,即使桌子略大于小组。