0

appDelegate には 2 種類の var があります: int と NSMutableArray です。viewController で int var にアクセスできますが、NSMutableArray にはアクセスできません。

コードは次のとおりです。

appDelegate.h

#import <UIKit/UIKit.h>  
@interface AppDelegate : UIResponder <UIApplicationDelegate,NINetworkImageViewDelegate,FBSessionDelegate, FBDialogDelegate> 
{
    UIWindow *window;
    UINavigationController *navController;
    int nbNewsNonLues;
    NSMutableArray *tableauNews;

}
@property (strong, nonatomic) NSMutableArray *tableauNews;
@property (nonatomic) int nbNewsNonLues;
@end

これらの変数はAppDelegate.mで適切に初期化されています(チェック済み)

次に、ViewController.m のこのコードでそれらにアクセスしようとします

@synthesize appDelegate = _appDelegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        NSLog(@"%@", appDelegate.tableauNews);
        NSLog(@"%d", appDelegate.nbNewsNonLues);
        NSLog(@"%@", appDelegate);
    }
    return self;
}

ログが返されます

2012-07-23 02:58:21.475 Aviso_0.1[2990:11303] (ヌル)

2012-07-23 02:58:25.432 Aviso_0.1[2990:11303] 2

2012-07-23 02:58:25.432 Aviso_0.1[2990:11303]

つまり、tableauNews にはアクセスできませんが、nbNewsNonlues にアクセスして変更することはできますか??

私はこれが初心者の問題であることを知っていますが、私は何時間も読んでグーグルで検索しました。委任について見逃したものがあるに違いありません

助けが必要、

4

1 に答える 1

1

次の 2 行は同じではありません。

NSMutableArray *tableauNews;

@property (strong, nonatomic) NSMutableArray *tableauNews;

最初のものでは、tableauNews という iVar を作成します。2 つ目では、_tableauNews というバッキング iVar を使用して、tableauNews というプロパティを作成します。バッキング iVar: _tableauNews のアンダー スコアに注意してください。これで、2 つの異なるオブジェクトが作成されました。iVar tableauNews とプロパティ self.tableauNews を割り当てたり、アクセスしたりすると、2 つの異なるオブジェクトにアクセスして割り当てます。ただし、前述のように、iVar _tableauNews はプロパティ self.tableauNews と同じです。今後この種のエラーを防ぐために、iVar にプレフィックスのアンダースコアを追加するのが慣例です。

コメント セクションの質問に回答するために更新されました。

この行では、プロパティ ( )@synthetise tableauNews = _tableauNewsのバッキング iVar ( ) を宣言する方法です。プロパティを上記のように宣言し、.m ファイルで対応する を宣言しようとすると、Xcode はアンダー スコア バージョン ( ) をバッキング iVar として自動的に提案するので、iVars 宣言でそれを宣言 ( )する必要はありません。ヘッダー ファイルのセクション。ただし、プロパティを独自のバッキング iVar に関連付けることはできます。たとえば、ヘッダー ファイルで呼び出した iVar を宣言した場合、理論的には .m ファイルでこれを行うことができます。しかし、それはお勧めできません。_tableauNewstableauNewstableauNews@synthesize tableauNews_tableauNews_tableauNewstableauNewsTest@synthesize tableauNews = tableuNewsTest

于 2012-07-23T02:12:27.833 に答える