0

次の変数をインスタンス変数として宣言し、m ファイルで使用していますが、警告が表示されます。

TransparentToolbar *tools;

オンラインで割り当てられたオブジェクトの潜在的なリーク ...

たとえば、そのためのプロパティを作成しようとしました..

@property (nonatomic, retain) TransparentToolbar *tools;

そしてそれを合成して解放しますが、私のビューは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];
}

ああ、私はオートリリースを持っています....しかし、それは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

さらに編集 ここに画像の説明を入力

4

3 に答える 3

5

定義する@propertyと、通常、クラスの ivar にアクセスするたびに、ドット表記であろうと標準メソッド呼び出しであろうと、getter/setter を使用します。

ドット表記

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

標準メソッド呼び出し

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

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

アップデート

@bbum が答えを教えてくれますが、コーディングの一貫性を高めることも有益だと思います。

たとえば、問題のある行の前に、セッターを使用せずに ivar に直接割り当てています。一貫性を保ち、時間をかけて合成したセッター/ゲッターを使用してください。私は書き直します

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

アップデート

ここに表示されているメモリ リーク:

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

UINavigationItemのドキュメントを見ると、次のようにrightBarButtonItem宣言されていることがわかります。retain

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

したがって、この呼び出しself.navigationItem.rightBarButtonItemは、渡されたオブジェクトに対して +1 の保持を行い、その後、別の +1 の保持である割り当て/初期化を行います。はUINavigationItem、ロックが解除されると保持を解放しますが、元の保持はまだぶら下がっています。

修正:

UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.tools];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
[rightBarButtonItem release]; rightBarButtonItem = nil;
于 2011-11-10T20:31:19.620 に答える
1
self.pickerSortingDataCurrent = [[NSArray alloc] initWithObjects:
  @"Next Date Ascending", 
  @"Next Date Descending", nil];     // removed some items here

+ allocの+1保持カウント、。への割り当ての+1保持カウントretain @property

次のように書き直します。

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

(または使用できますautorelease

于 2011-11-10T21:41:55.903 に答える
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];)。そのパターンに従えば、問題はないはずです。

于 2011-11-10T20:33:27.217 に答える