我在xcode 4.2(旧版本)中进行我的项目。对于我的应用程序,我只是在dto类中设置变量,数组,以便在整个应用程序生命周期中使用。所以我设置了这样的属性。
AppDTO(NSObject的子类)
AppDTO.h
@property(nonatomic,retain)anotherAppDTO *aAppDTO;
@property(nonatomic,retain)NSMutableArray *array1;
@property(nonatomic,retain)NSMutableArray *array2;
@property(nonatomic,retain)NSString *string1,*string2,*string3;
AppDTO.m
- (id)init
{
self = [super init];
if (self) {
self.aAppDTO = [[anotherAppDTO alloc]init];
self.array1 = [[NSMutableArray alloc]init];
self.array2 = [[NSMutableArray alloc]init];
self.string1 = @"Hello";
self.string2= @"Hai";
}
}
-(void)dealloc
{
if(array1 != nil)
{
[array1 release];
array1 = nil;
}
if(array2 != nil)
{
[array2 release];
array2 = nil;
}
[aAppDTO release];
aAppDTO = nil;
[super dealloc];
}
当我在Xcode 4.3.2中分析我的应用程序时,我在self.array1和self.array2(在线分配的对象上的潜在泄漏......)中得到内存警告,但是当我将self.array1更改为array1时,警告发生了程。
使用自我的原因是什么。如果我将@property(nonatomic,retain)设置为变量(如array1,array2,string1,string2),是否需要使用self。
同样在dealloc方法中,我听说我们不想使用[self.array1 release],而是可以使用[array1 release]。它是正确的吗?
我是否需要在dealloc方法中释放我的字符串。
我也在dealloc方法中发布了一个AppDTO。如果我在另一个AppDTO类中分配一些对象,它会在我调用[aAppDTO release]方法时自动释放。
任何人都可以澄清我。
非常感谢, 阿尼什
答案 0 :(得分:4)
你得到警告,因为当你写:
self.array1 = [[NSMutableArray alloc]init];
与:
相同[self setArray1: [[NSMutableArray alloc]init]];
您可以注意到您没有分配基础array1
私有变量,但您正在调用属性的setter,因为它被声明为 retain 它保留了一旦分配的对象,这个意味着当你最终第二次用setter分配另一个对象时,第一个对象将保留一个的保留计数,直到应用程序将被关闭(因为您不再对该对象有任何引用......)。
查看this精彩文章,了解Objective-C中更好的手动参考计数。
答案 1 :(得分:2)
当我在Xcode 4.3.2中分析我的应用程序时,我在self.array1和self.array2中获得内存警告(在线上分配对象的潜在泄漏......),但是当我将self.array1更改为array1时,警告发生程。
分析仪是对的。设置时参数为retain
。同样,您应该支持初始化和dealloc
中的直接访问。所以,你应该写array1 = [[NSMutableArray alloc] init];
,然后完成。
使用自我的原因是什么。如果我将@property(非原子,保留)设置为变量(如array1,array2,string1,string2),我是否需要使用self。
那些通过访问器方法。如果不是在初始化或dealloc
,你应该倾向于通过访问器方法,因为这是完全构造的对象的通用正确执行路径。
同样在dealloc方法中,我听说我们不想使用[self.array1 release],而是可以使用[array1 release]。它是正确的吗?
正确。
我是否需要在dealloc方法中释放我的字符串。
是
我也在dealloc方法中发布了一个AppDTO。如果我在另一个AppDTO类中分配一些对象,当我调用[aAppDTO release]方法时它会自动释放。
当其引用计数达到0时,将调用其dealloc
。
答案 2 :(得分:0)
我认为其他人已经回答了你的问题。
我确实想提请你注意Apple优秀的Advance Memory Management Programming Guide: Practical Memory Management,他们会在这些场景中走过这些场景。在第一次阅读时很难全部完成,但它确实涵盖了这些内容。在回答关于使用实例变量和访问器方法的问题时,我提请您注意标记为“不要在初始化方法和dealloc中使用访问器方法”的部分。