何时使用属性和分配初始化

时间:2011-12-26 19:45:49

标签: iphone ios cocoa-touch cocoa

我正在处理我的应用程序,我需要在NSMutableData的实例变量中设置一个值。现在我还为我的实例变量创建了一个属性,这意味着我的程序会自动分配它等等,对吧?但后来我给它分配了一个值,但它没有接受它,但保持无效。然后我手动分配它,然后突然接受了该值。所以现在我的问题是对属性的需求是什么,为什么我必须手动分配我的实例变量,尽管我为它设置了属性?

提前致谢!

编辑:我的代码:

在我的.h文件中

@interface FirstScreen : UIViewController{
NSMutableData* fetchedData;

}

@property(nonatomic, retain)NSMutableData*fetchedData;

在我的.m文件中我有:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
NSString* fetchedDataString= [[NSString alloc]initWithData:fetchedData      encoding:NSUTF8StringEncoding];
}

现在,如果我没有实施:

-(void)viewDidLoad{
self.fetchedData=[[NSMUtableData alloc]init];
}

fetchedDataString没有任何值。但是,如果它被分配,它有一个值。我很想知道何时分配实例变量以及何时不分配。

3 个答案:

答案 0 :(得分:1)

它没有分配。所有属性都为您定义实例变量&实现访问方法。

我假设“分配一个值”,你的意思是试图设置你认为已经为你分配的NSMutableData对象的内容。

答案 1 :(得分:1)

  

现在我还为我的实例变量创建了一个属性,意思是   我的程序会自动分配它,对吗?

错误。如果您为该属性合成访问器,如果您尚未创建一个ivar,也将为其创建一个ivar。但是你的属性只是一个指针......除非你创建一个指向它的对象并设置它,否则它不指向任何东西:

self.fetchedData = [[NSMutableData alloc] init];

答案 2 :(得分:0)

那就是C.你说的是每一个变量,无论是本地变量还是实例变量。为变量声明存储是一回事(这就是你所做的一切)宣布财产)。给它一个值是另一个。代码中的此声明:

NSMutableArray* arr;

...不会导致arr接受任何特定值(在ARC下它是零;在ARC之前它可以是任何东西)。它肯定不是一个空的可变数组!但这与您申报财产时所做的完全类似。

如果这是变量采用的第一个值,则称为初始化。你可能会在代码中说:

NSMutableArray* arr = [NSMutableArray array];

但是你不能在属性声明中这样做,所以你必须在代码运行时稍后进行初始化。一种典型的方法是在你指定的初始化器中执行此操作,这样无论以后发生什么,从很早就开始在这个地址上有一个实际的数组。

我写了一本关于这个主题的书(iOS编程),关于你所遇问题的章节可以在网上免费阅读:

http://www.apeth.com/iOSBook/ch03.html