1

Objective-Cのメモリ管理について明確にする必要があります。

クラスヘッダーでオブジェクトを@propertyなしでivarとして宣言すると、次のようになります。

 @interface MyFacebooDelegate : UIViewController 
 {
     TableViewController *tableController;
 }
 ...
 @end

そして、たとえばコードのどこかで- (void)viewDidLoad

tableController = [[TableViewController alloc] init];

それで、それを解放する最良の方法はどこにありますか。インスタントオブジェクトをプロパティにするとどうなりますか?そして、メモリ管理もどうなるか

@interface MyFacebooDelegate : UIViewController 
 {
     TableViewController *tableController;
 }
 ...
 @end
@property (nonatomic, strong) TableViewController *tableController;

次の構文は、オブジェクトviewControllerに対して正確に何をしますか。

.h

 @interface AppDelegate : UIResponder <UIApplicationDelegate>
 @property (strong, nonatomic) ViewController *viewController;
 @end 

.m

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

- (void)dealloc
{
  [_window release];
  [_viewController release];
  [super dealloc];
}
.....
@end

メソッドを介してオブジェクトを別のクラスに返したい場合、autorelease最初にメソッド本体でオブジェクトを返し、次にretainレシーバー側でオブジェクトを返す必要がありますか?たとえば、このメソッドは、メソッド本体とレシーバー側でも正確に何をするかを示します。

-(NSString *)getFriendId
 {
NSArray *ar = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
return [ar objectAtIndex:0];
 }

私はこれをよく知っていますが、私は本当に混乱していて、あなたの助けが必要です。

4

2 に答える 2

2

1)最善の方法はdeallocです。または再設定する直前。

2)プロパティはあなたのために保持/解放を行います。しかし警告!あなたは物事を混同し続けます。ここでは、ARCに関連する「strong」を使用します。従来の保持/解放を使用することを本当に主張する場合(使用すべきではありません)、代わりに(非アトミック、保持)を使用してください。

3)プロパティはdeallocで割り当て解除されます。ここでも、強いのは間違っています。

4)はい。理想的にはそうすべきです。ARCが素晴らしいもう1つの理由は、これをすべて自動的に行うことです。

tl; dr:ARCを使用します。二度と戻らないでください。(しかし、それでも手動のメモリ管理を学びます)

于 2012-07-16T14:40:14.053 に答える
1

ARCは、すべてのメモリ管理に関する質問に対する答えです。に加えて、強いプロパティと弱いプロパティに関するメモをインポートします。

iOSの強力なプロパティ:非常に強力なのは、ARCの前のプロパティ宣言で保持するのと同じです。ARCプロジェクトの場合、保持する代わりに強力を使用し、Cプリミティブプロパティに割り当てを使用します。

iOSアウトレットは、宣言されたプロパティとして定義する必要があります。ファイルの所有者からnibファイル(またはiOSではストーリーボードシーン)のトップレベルオブジェクトまでのアウトレットを除いて、アウトレットは一般的に弱くする必要があります。したがって、作成するアウトレットは通常、デフォルトで弱くなります。たとえば、ビューコントローラのビューのサブビューやウィンドウコントローラのウィンドウに作成するアウトレットは、所有権を意味しないオブジェクト間の任意の参照です。

于 2012-07-16T14:57:39.563 に答える