2011-11-10 14 views
0

私は以下の変数をインスタンス変数として宣言していますが、これを私のmファイルで使用していますが、警告が表示されています。Obj-C、行に割り当てられたオブジェクトの潜在的なリーク、警告?

TransparentToolbar *tools; 
行に割り当てられたオブジェクトの

潜在的な漏れ...私は例えばそれのプロパティを作成しようとした「

..

@property (nonatomic, retain) TransparentToolbar *tools; 

そしてsynthesize'ing、それを解放しますしかし、私の見解はdeallocの終わりにクラッシュします。

私は間違っていますか?

EDIT 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]; 
} 

えーえ、私は自動解放している....それはpickerSortingDataCurrent ...

EDITを解決しません...

#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"]; 

あなたは常に明示的にこれらのゲッターとセッターを使用している場合、あなたはかなりあなたのコード内の任意の場所にリリースを呼び出す必要はありませんdeallocまたはオーバーライドされたsetMyVar:メソッドを除きます。このようにすることで、限られた場所でメモリ管理を行うことができます。あなたが解放して自分自身を保持し始めるなら、物事はあなたが最初に始めるとき少し複雑になることがあります。

UPDATE

@bbumはあなたに答えを与えるが、私は、あなたが同様にあなたのコーディングでより一貫性であることから利益を得るであろうと思います。

たとえば、違反行の前に、セッターを使わずに直接ivarに割り当てています。一貫して、あなたが合成する時間を取ったセッター/ゲッターを使用してください。

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

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が実際に設定されていることを確認しなければならないので、それが似たものになるはず書き直します

更新

あなたはここで見ている

メモリリーク:

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

は+あなたがUINavigationItemためのドキュメントを見ているので、あなたがrightBarButtonItemretain

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem 

。したがって、コールself.navigationItem.rightBarButtonItemがかかりますように宣言されていることがわかりますです1はあなたが渡したオブジェクトに保持され、次にあなたはもう1つの+1保持であるalloc/initingです。 UINavigationItemは、deallocされたときにretainを解放しますが、オリジナルのretainがまだ残っています。

修正:

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

shot – Jules

0

あなたはretainでプロパティを作成する場合は、あなたのdeallocメソッドでnilに設定する必要があります。ほとんどあなたが成功したメモリ管理戦略を持ってしなければならないすべてです

すなわち

@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 +アロケーションのカウントを保持して、1はretain@propertyへの割り当てのためのカウントを保持しています。

としてそれを書き換え

:それは、コードなしで言うのは難しいです

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

(それとも、autoreleaseを使用することができます)

+0

これは、上記のコメントを見る前に私にはまだ警告が表示されています。 – Jules

関連する問題