新手请问入门有关问题

新手请教入门问题。
基本的操作是给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 了,至于为什么,你想一想就明的了。
------解决方案--------------------
探讨

1. line1 原则上变量是要申明的
2. self.pickerDataj 执行的是一个方法,而pickerData = 只是变量的赋值 。

self.xxx = ,实际上这样去执行的:

-(void) setPickerDataj: (NSArray*) c{
[c retain];
[pickerData release];
pickerData=c;
}
……

------解决方案--------------------
1.可以不用声明。如果line1与line2处两个不一样的时候就需要声有。
2. 因为line2处你是retain的方式定义属性的,所以会
C/C++ code
-(void) setPickerDataj: (NSArray*) c{
  if(c != pickerData ) {
  [pickerData release];
  pickerData = [c retain];
  }
}