1.copy 调用copy方法(或者说向对象发送copy消息),创建一个新的对象,其引用计数为1;原来对象的引用计数不变。
2.在子视图添加(addSubview)到父视图的时候,子视图的引用计数会自动的增加1,当父视图被release的时候,该父视图上面的所有子视图的引用计数都会被release一次,使子视图的引用计数减1,这样一增一减保持了retain/release的平衡。
3.成员变量”内存管理的规则,如果是通过alloc/init创建的对象,那么需要在dealloc时候向其发送release消息;如果不是通过alloc/init方法创建的对象,例如通过类方法创建的,那么不需要在dealloc时候向其发送release消息,比如_name = [NSString stringWithFormat:@"xxx"];或者数组_petArray = [NSArray arrayWithObject:@"dog",@"cat",@"duck",nil];。
4.@property (nonatomic, retain) TestObject *testObject;
当我们使用self.testObject作为右值的时候,相当于调用了getter方法,这没有什么需要注意的地方;当使用self.testObject作为左值的时候,就有一些注意的地方了,例如下面的语句,
self.testObject = [[TestObject alloc] init];//这是错误的,因为alloc/init创建的对象,在setter内部又被retain了一次,导致引用计数retainCount=2,造成内存泄露
//修改代码如下
TestObject *tempTestObject = [[TestObject alloc] init];
self.testObject = tempTestObject;
[tempTestObject release];
//或者
_tempTestObject = [[TestObject alloc] init];
这样就保证了self.testObject引用计数为1,在整个类的作用域都可以放心安全使用,然后在dealloc的时候向该对象再发送release对象,释放其内存空间,
- (void)dealloc
{
[self.testObject release];
//或者,对应_tempTestObject = [[TestObject alloc] init];
[_tempTestObject release];
[super dealloc];
}
还有一种情况,self.testObject是通过TestObject的类方法初始化的,这时候就可以直接初始化,如下代码,
self.testObject = [TestObject testObjectWithClassMehtod:xxx];//这样写没有问题
这样创建的对象是被类方法放入自动释放池来管理其引用计数和生命周期,而不用担心内存泄露的问题。虽然这时候内存不需要我们来手动释放了,但是为了编码规范,还是在dealloc时候向其发送release消息,
- (void)dealloc
{
[self.testObject release];
[super dealloc];
}