关于self的使用会影响retainCount的总结
首先创建对象的方法如下:
MyClass.h
@interface MyClass : NSObject {
MyObject *myObject;
}
@property (nonatomic, retain) MyObject *myObject;
@end
MyClass.m
@synthesize myObject;
类型一
加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
self.myObject = aMyObject; //myObject retainCount = 2;
[aMyObject release];//myObject retainCount = 1
第一条语句声明并初始化一个MyObject的对象。
第二条语句将aMyObject赋值给当前对象的myObject.
第三条语句将retainCount减一。
因为调用了(self.),所以retainCount会增加1,而后面的release会将retainCount 减1,这样在外部调用autoreleasepool时,该内存将会被释放。
类型二
不加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
myObject = aMyObject; //myObject retainCount = 1;
[aMyObject release];//对象己经被释放
第一条语句声明并初始化了一个MyObject的对象。
第二条语句将指针aMyObject赋值给指针myObject,并不影响内存。
第三条语句将retainCount减1,这时对象被释放。
类型三
self.
self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;
此语句相当于类型一,只不过是直接将初始化完成后的对象赋值给self.myObject,此时因为调用了(self.),所以retainCount变成了2.
类型四
不加self.
myObject = [[MyObject alloc] init]; //myObject retainCount = 1;
此语句相当于类型二,只不过是直接将初始化完成后的对象赋值给myObject,因为没有调用(self.)方法,所以不影响内存。
简单而言,self.是访问属性的存取方法,对于@property时的参数retain,其内部是
// retain
-(void)setMyObject:(id)newValue{
if (_myObject != newValue) {
[_myObject release];
_myObject = [newValue retain];
}
}
所以此处会调用retain使得retainCount加1。
使用时应该注意(self.)可能会影响retainCount,造成内存泄露。
首先创建对象的方法如下:
MyClass.h
@interface MyClass : NSObject {
MyObject *myObject;
}
@property (nonatomic, retain) MyObject *myObject;
@end
MyClass.m
@synthesize myObject;
类型一
加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
self.myObject = aMyObject; //myObject retainCount = 2;
[aMyObject release];//myObject retainCount = 1
第一条语句声明并初始化一个MyObject的对象。
第二条语句将aMyObject赋值给当前对象的myObject.
第三条语句将retainCount减一。
因为调用了(self.),所以retainCount会增加1,而后面的release会将retainCount 减1,这样在外部调用autoreleasepool时,该内存将会被释放。
类型二
不加self.
MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
myObject = aMyObject; //myObject retainCount = 1;
[aMyObject release];//对象己经被释放
第一条语句声明并初始化了一个MyObject的对象。
第二条语句将指针aMyObject赋值给指针myObject,并不影响内存。
第三条语句将retainCount减1,这时对象被释放。
类型三
self.
self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;
此语句相当于类型一,只不过是直接将初始化完成后的对象赋值给self.myObject,此时因为调用了(self.),所以retainCount变成了2.
类型四
不加self.
myObject = [[MyObject alloc] init]; //myObject retainCount = 1;
此语句相当于类型二,只不过是直接将初始化完成后的对象赋值给myObject,因为没有调用(self.)方法,所以不影响内存。
简单而言,self.是访问属性的存取方法,对于@property时的参数retain,其内部是
// retain
-(void)setMyObject:(id)newValue{
if (_myObject != newValue) {
[_myObject release];
_myObject = [newValue retain];
}
}
所以此处会调用retain使得retainCount加1。
使用时应该注意(self.)可能会影响retainCount,造成内存泄露。