我正在处理我的应用程序,我需要在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没有任何值。但是,如果它被分配,它有一个值。我很想知道何时分配实例变量以及何时不分配。
答案 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编程),关于你所遇问题的章节可以在网上免费阅读: