2011-11-10 78 views
0

我宣布以下变量作为实例变量,并在我的m文件中使用它,但是我收到警告。Obj-C,在线分配的对象的潜在泄漏,警告?

TransparentToolbar *tools; 

就行分配的对象的潜在泄漏...

我曾尝试创建一个属性,例如..

@property (nonatomic, retain) TransparentToolbar *tools; 

而且synthesize'ing并将其释放,但是我的观点在dealloc结束时崩溃了。

我在做什么错?

编辑在pickerSortingDataCurrent同样的警告......

h 
@interface myViewController : UIViewController <UIActionSheetDelegate, 
    UIPickerViewDelegate, UIPickerViewDataSource, UITableViewDelegate, 
    UITableViewDataSource, MFMailComposeViewControllerDelegate> { 

    TransparentToolbar *tools; 

    NSArray *pickerSortingDataCurrent; 
} 
@property (nonatomic, retain) TransparentToolbar *tools; 
@property (nonatomic, retain) NSArray *pickerSortingDataCurrent; 

m 
@synthesize pickerSortingDataCurrent; 
@synthesize tools; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tools = [[[TransparentToolbar alloc] 
      initWithFrame:CGRectMake(0, 0, 70, 44.01)] autorelease]; 
    tools.barStyle = UIBarStyleBlackOpaque; 

    self.pickerSortingDataCurrent = [[NSArray alloc] initWithObjects: 
     @"Next Date Ascending", 
     @"Next Date Descending", nil];  // removed some items here 
} 

- (void)dealloc { 
    [tools release]; 
    [pickerSortingDataCurrent release]; 
    [super dealloc]; 
} 

AHHHH我已经自动释放....但这并不解决pickerSortingDataCurrent ...

编辑...

#import "TransparentToolbar.h" 

@implementation TransparentToolbar 

- (void)drawRect:(CGRect)rect { 
    // do nothing in here 
} 

- (void) applyTranslucentBackground 
{ 
    self.backgroundColor = [UIColor clearColor]; 
    self.opaque = NO; 
    self.translucent = YES; 
} 

- (id) init 
{ 
    self = [super init]; 
    [self applyTranslucentBackground]; 
    return self; 
} 

// Override initWithFrame. 
- (id) initWithFrame:(CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    [self applyTranslucentBackground]; 
    return self; 
} 

@end 

其他编辑 enter image description here

+0

很难不代码说。 – Max

+0

你可以包含你的'dealloc'代码吗? – Jef

+0

我遇到了同样的问题,我在viewDidLoad中填充了一个接口数据数组,请参阅上面的编辑。 – Jules

回答

5

如果您定义了@property,那么通常您在任何时候访问您的课堂中的ivar时,都可以使用getter/setter,无论是点符号还是标准方法调用。

点标记

id localyMyVar = self.myVar; 
self.myVar = @"A string"; 

标准方法调用

id localMyVar = [self myVar]; 
[self setMyVar:@"A string"]; 

如果你总是明确地使用这些getter和setter方法,那么你几乎不需要在你的代码的任何地方调用release除了dealloc或重写的setMyVar:方法。这样做可以让内存管理在有限的地方发生。如果你开始释放和保持自己,那么当你第一次出发时,事情会变得有点复杂。

UPDATE

@bbum给你答案,但我认为你会被你的编码以及更多洽受益。

例如,在不使用setter的情况下直接分配给ivar的违规行之前。保持一致并使用你花费时间综合的setter/getter。我会改写

tools = [[[TransparentToolbar alloc] 
     initWithFrame:CGRectMake(0, 0, 70, 44.01)] autorelease]; 
tools.barStyle = UIBarStyleBlackOpaque; 

TransparentToolbar *tmpTools = [[TransparentToolbar alloc] initWithFrame:CGRectMake(0, 0, 70, 44.01)]; 
tmpTools.barStyle = UIBarStyleBlackOpaque; 
self.tools = tmpTools; 
[tmpTools release]; tmpTools = nil; 

init方法是不是真的以下任你应该检查self实际的指导方针,所以它应该类似于东西:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self applyTranslucentBackground]; 
    } 
    return self; 
} 

UPDATE

你在这里看到的内存泄漏:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools]; 

是因为你在看文档为UINavigationItem你会看到rightBarButtonItem被声明为retain

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem 

因此通话self.navigationItem.rightBarButtonItem将采取A + 1保留在你传入的对象上,然后你是alloc/initing,这是另一个+1保留。 UINavigationItem将在释放时释放它的保留,但仍会保留原始保留。

的修复:

UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools]; 
self.navigationItem.rightBarButtonItem = rightBarButtonItem; 
[rightBarButtonItem release]; rightBarButtonItem = nil; 
+0

我仍然收到由此行引发的警告'self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools];' – Jules

+0

请参阅屏幕拍摄 – Jules

0

如果您创建了一个retain属性,则必须将其设置为你的dealloc方法为零。

@interface DMFakeyClass : NSObject 

@property (nonatomic, retain) NSString *bogusString; 

@end 

@implementation DMFakeyClass 

-(void)dealloc { 
    self.bogusString = nil; 
    [super dealloc]; 
} 

@end 

这几乎是所有你需要做的有一个成功的存储管理策略。当您使用此属性时,请始终使用getter/setter(self.bogusString = [NSString stringWithString:@"bogus"];)并确保您已经自动发布或发布了您分配的任何内容(self.bogusString = [[[NSString alloc] initWithString:@"bogus2"] autorelease];)。按照这种模式,你不应该有任何问题。

1
self.pickerSortingDataCurrent = [[NSArray alloc] initWithObjects: 
    @"Next Date Ascending", 
    @"Next Date Descending", nil];  // removed some items here 

+1保留为+ ALLOC计数+1保留计数分配到retain@property

重写成:

NSArray *labels = [[NSArray alloc] initWithObjects: 
    @"Next Date Ascending", 
    @"Next Date Descending", nil]; 
self.pickerSortingDataCurrent = labels; 
[labels release]; 

(或者你可以使用autorelease

+0

在看到上面的评论之前,这仍然给我一个警告。 – Jules