0

私はいつも@synthesize.hファイルで宣言されたクラスプロパティでを使用してきました。ここにあるいくつかのAppleドキュメントでPhotoPickerの例に出くわし、本当に紛らわしい宣言を見つけました。AppDelegateクラス(.hファイル)では、次のようなivarは作成せず、プロパティのみを作成します。

#import <UIKit/UIKit.h>
@interface AppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end

そして彼らのAppdelegate.mファイルに彼らはこれを書いています:

#import "AppDelegate.h"

@interface AppDelegate ()
@property (nonatomic, retain) IBOutlet UINavigationController *navController;
@end

@implementation AppDelegate;

@synthesize現在、ディレクティブやivarは見つかりませんが、deallocメソッドを見ると、いくつかの「見えない」ivarが解放されます(What ???)

- (void)dealloc
{
    [_navController release];
    [_window release];

    [super dealloc];
}

また、viewControllerクラスでは、プロパティをnilに設定し、メソッドviewDidUnload内の(作成されていない)「ivars」を解放しdeallocます。

これはいくつかの新しいXcodeのことと関係がありますか?誰かがこれに光を当てることができますか?私は自分のロジックをチェックしていてdidReceiveMemoryWarning、常にプロパティをnilに設定しviewDidUnload、ivarをリリースしてdeallocいましたが、これは以前に見たことがありませんでした。

助けてくれてありがとう

4

1 に答える 1

0

Xcode4.5はプロパティを自動合成できます。これは、通常のセッター/ゲッターを作成することによってこれを行い、先頭に「_」が付いたivarも作成します。それが気に入らない場合は、独自に追加できます。

@synthesize foo;

または、必要なivarを使用します。

@synthesize foo=MyFoo;

これらのプロパティと合成の問題は、メモリ管理と直交しています。ARCを使用していて、上記の手法が機能する場合は、deallocを使用する必要はありません。ただし、arcを使用しない場合は、[_foorelease]を使用してdeallocでオブジェクトを解放する必要があります。

self.foo = nilと言うよりもリリースが推奨される理由は、オブジェクトが正式にリリースされた後にセッターを使用するとKVO通知が生成されるためです。

于 2012-10-19T11:32:55.897 に答える