基本的操作是给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.   

    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 了,至于为什么,你想一想就明的了。
      

  2.   

    其实是这样执行的
    -(void) setPickerDataj: (NSArray*) c{
        if(c != pickerData ) {
            [pickerData  release];
            pickerData = [c retain];
        }
    }
      

  3.   

    1.可以不用声明。如果line1与line2处两个不一样的时候就需要声有。
    2.  因为line2处你是retain的方式定义属性的,所以会-(void) setPickerDataj: (NSArray*) c{
      if(c != pickerData ) {
      [pickerData release];
      pickerData = [c retain];
      }
    }
    这样执行 line3这句。如果你声名的是assign那一样会错。
    这里有个引用记数的概念,请参看:http://www.cocoachina.com/macdev/cocoa/2010/1015/2194.html
    把这文章搞懂了,你的内存管理就差不多OK了。
      

  4.   

    上边的回答的很好了 建议楼主看看object-c中的内存管理 哈