在XCode 4中使用分析器,由于设置了这样的属性,我收到有关潜在内存泄漏的警告:
self.newDog.dogName = self.dogNameTextField.text;
具体警告是:
属性返回一个具有+1保留计数(拥有引用)的Objective-C对象。
第513行分配的对象以后未在此执行路径中引用,并且保留计数为+1(对象泄露)
如果我没有使用self设置属性,则警告消失......但我不确定这是否会导致其他问题,因为我读过的所有内容基本上都表示在设置时始终使用self得到属性:
newDog.dogName = self.dogNameTextField.text;
我在这里做错了吗?以下是视图控制器中发生警告的一些精简代码:
@interface AddDogViewController : UITableViewController {
Dog *newDog;
}
@property (nonatomic, retain) Dog *newDog;
@implementation AddDogViewController
@synthesize newDog;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// some other code
self.newDog.dogName = self.dogNameTextField.text;
// some other code
}
- (void)dealloc {
[newDog release];
[super dealloc];
}
@end
答案 0 :(得分:8)
根据内存管理规则,以new
开头的方法会返回+1保留计数(就像alloc
和copy
)。您的访问者newDog
具有此名称。
您应该将属性重命名为不以new
开头的内容。请注意,您实际上并没有泄漏任何东西。你只是混淆了分析器,因为你违反了命名规则。
答案 1 :(得分:2)
这是因为当您访问执行ivar
的{{1}}时,您正在使用self.myIvar
setter
方法执行此操作,因此如果它被声明为synthesized
,它会向其发送另外的retain
消息。
如果直接访问私有变量,即不使用不使用retain
的setter,则不会发生这种情况。