先看一下面的类:
MyClass.h
@interface MyClass : NSObject {
MyObject *myObject;
}
@property (nonatomic, retain) MyObject *myObject;
@endMyClass.m
@synthesize myObject;
-(id)init{
if(self = [super init]){
MyObject * aMyObject = [[MyObject alloc] init];
self.myObject = aMyObject;
[aMyObject release];
}
return self;
}
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount=1;
self.myObject=aMyObject;//myObject retainCount=2;
这是为什么呢?
@property (nonatomic, retain) MyObject *myObject;
是用来设置属性的存取方法的,
这要分析一下 retain,assign,copy
// assign
-(void)setMyObject:(id)newValue{
myObject = newValue;
}
// retain
-(void)setMyObject:(id)newValue{
if (_myObject != newValue) {
[myObject release];
myObject = [newValue retain];
}
}
// copy
-(void)setMyObject:(id)newValue{
if (myObject != newValue) {
[myObject release];
myObject = [newValue copy];
}
这样看,self. 是用来调用方法的,
- (MyObject *)myObject{
return myObject;
}
self.myObject 就是在调用方法,方法名就是属性名,
如果上面代码写为:
myObject=[[MyObject alloc]init];// myObject retainCount =1
这样就只是指针赋给另一个指针了,
在很多时候是用到 self. 的,
在UITableView中 绘制 UITableViewCell的方法中 在要获得数据时 就要用到 self. 的
UITableView 的滚动是要动态的加载数据的,所以要调用方法来读取数据,如果用属性的话就不能动态的读取数据了,这时就会报错,(读取越界问题)。