0

私の開発環境:

Xcode 4.6.2

非自動参照カウント

たとえば、 というビュー コントローラCertainViewController.mがあり、プロパティcertainPropertyが属性とともにretain呼び出され、nonatomic宣言されているとします。

// CertainViewController.h
@interface CertainViewController : UIViewController
{
}
@property (retain, nonatomic) certainPropertyClass *listData;

// CertainViewController.m
- (void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.certainProperty = [[[certainPropertyClass alloc] init] autorelease];
    // Among other initialization...
}

このメソッドでは、プロパティに新しい値を割り当てるときにdealloc暗黙的です。これが潜在的に危険かどうかはわかりません。releasecertainProperty

// CertainViewController.m
- (void) dealloc
{
    self.certainProperty = nil;
}

いくつかの洞察を共有してください、ありがとう:D

4

4 に答える 4

3

First, you code is wrong

// CertainViewController.m
- (void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    //[[[self.certainProperty alloc] init] autorelease]; // this is a nop if self.certainProperty is nil or crash if not nil
    self.certainProperty = [[[YourPropertyClass alloc] init] autorelease];
    // Among other initialization...
}


// CertainViewController.m
- (void) dealloc
{
    self.certainProperty = nil;
    [super dealloc]; // you must call super
}

Second, assuming certainProperty is a retained property, assign a value to it will call retain by the setter.

So doing

self.certainProperty = nil;

in dealloc is required to balance the retain count otherwise certainProperty will be leaked.

于 2013-05-24T02:01:32.867 に答える
1

autorelease非 ARC 環境で変数を解放することは厳密には危険ではありません。ただし、autorelease手動で簡単に解放できる変数にタグ付けすることは、良い習慣とは見なされません。autoreleaseシステムがオブジェクトを必要としなくなったらすぐにオブジェクトを削除したい場合、通常はわからないときに使用することを意図しています。したがって、コードが厳密に無効というわけではありませんが、メソッドreleaseなどでオブジェクトを解放するタイミングが正確にわかっている場合は、手動で呼び出すのが最善であることを知っておいてください-dealloc

于 2013-05-24T01:53:40.983 に答える
1

それを autorelease プールに入れる場合は、autorelease に任せるべきです。個人的には、自動解放プール (GUI オブジェクト参照など) が必要でない限り、オブジェクトの解放は自分で処理します。しかし、それを設定することnilは問題ではありません。nil副作用なしで、オブジェクトに対して終日操作を実行できます。

于 2013-05-24T01:55:11.963 に答える
1

コンベンションに固執します。他の方法では実行できない本当に重要な何かがない限り、通常の記憶モデルに逆らわないでください。

release保持カウントを 1 減らします。したがって、これを呼び出すのは安全ではありませんrelease。他の 1 つのオブジェクトがこれを保持している可能性があるため、保持カウントは 1 です。したがって、呼び出しreleaseによって割り当てが解除される可能性があります。それは一般的にです。

プロパティがある場合retain、それにオブジェクトを割り当てると、そのオブジェクトが保持されます。

self.retainProperty = [[[MyObject alloc] init] autorelease] その結果、retainCount = 1 になります。

注:初期化の方法certainPropertyviewDidLoad:間違っています。allocはクラス メソッドであり、実際には新しく割り当てられたオブジェクトを返します。したがって[[[self.certainProperty alloc] init] autorelease];、プロパティを設定しません。xlc が彼の答えで言ったようにしてください。

于 2013-05-24T02:10:43.903 に答える