新手请教入门问题。
基本的操作是给UIPickerVIew绑定数据,代码照着书上copy的
.h文件中
{
NSArray* pickerData; //line:1
}
@property(nonatomic,retain) NSArray* pickerData; //line2
.m文件中
//开头
@synthesize pickerData;
//load事件
NSArray* array = [[NSArray alloc] initWithObjects:@"Luke",@"Leia",@"Han",@"Chewbacca",@"Artoo",@"Threepio",@"Lando", nil];
self.pickerData = array; //line3
[array release]; //line4
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return [pickerData count]; //line5
}
问题:
1. line1 代码好像没用吧?删掉一样可以运行。
2. line3代码如果直接改成 pickerData = array; 在line5中会出错。 而如果注释掉line4,就可以,
说明pickerData = array; pickerData应该直接引用的array地址吧?
但是pickerData = array; 和self.pickerData = array; 到底有什么区别没弄明白。
[解决办法]
1. line1 原则上变量是要申明的
2. self.pickerDataj 执行的是一个方法,而pickerData = 只是变量的赋值 。
self.xxx = ,实际上这样去执行的:
-(void) setPickerDataj: (NSArray*) c{
[c retain];
[pickerData release];
pickerData=c;
}
它有一套retain 和 release操作,它可以将值 进行retain操作,即时变量在外面release了,它会将它retain后赋值 。保证它不会出错。
针对上面的例子:
self.pickerData = array; //line3 array是一个非基本类型,也就是说它的赋值实际上是一个指针的赋值
[array release]; //line4 这里你已经将array释放了,所以array变成了一个nil指针
return [pickerData count]; //line5 而pickerData 又指向的是那个array指针,所以就会出错了。
如果你将line 4 行注释掉,就可以用 pickerData = array 了,至于为什么,你想一想就明的了。
[解决办法]
-(void) setPickerDataj: (NSArray*) c{ if(c != pickerData ) { [pickerData release]; pickerData = [c retain]; }}