读书人

新手请问入门有关问题

发布时间: 2012-01-20 18:53:53 作者: rapoo

新手请教入门问题。
基本的操作是给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];  }} 

读书人网 >Iphone

热点推荐