2010-12-21 9 views
1

Ich erstelle ein neues "View-based Application" Projekt und modifiziere die didFinishLaunchingWithOptions: Methode wie folgt.Daten in AppDelegate laden, aber später in UIView nicht zugreifen? Was ist los mit dir?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after application launch. 
    // Add the view controller's view to the window and display. 
    [self.window addSubview:viewController.view]; 
    [self.window makeKeyAndVisible]; 
    downloader = [[InternetIOProcess alloc] init]; 
    [downloader initWithServer:[NSURL URLWithString:@"http://www.test.com"] ]; 
    return YES; 
} 

InternetIOProcess ist ein NSObject mit zwei Variablen und ein Verfahren:

@interface InternetIOProcess : NSObject { 
    NSMutableArray* downloadingFile; 
    NSURL* serverAddress;} 
@property (nonatomic,retain) NSMutableArray* downloadingFile; 
@property (nonatomic,retain) NSURL* serverAddress; 
-(void) initWithServer:(NSURL*) server; 

die Umsetzung von InternetIOProcess ist:

@implementation InternetIOProcess 
@synthesize downloadingFile,serverAddress; //,serviceuploadingQueue,; 
-(void) initWithServer:(NSURL*) server 
{ 
    downloadingFile = [NSMutableArray array]; 
    serverAddress = server; 
} 

Und dann schreibe ich eine IBAction in UIViewController Reaktion auf eine Schaltfläche "innen aufbessern" Ereignis:

-(IBAction) test:(id)sender 
{ 
    MyAppDelegate* d = (MyAppDelegate*)[UIApplication sharedApplication].delegate; 
    InternetIOProcess* thedownloader = d.downloader; 
    //value of "thedownloader" incorrect. 
} 

Versuchen Sie hier auf "theDownloader" zuzugreifen, sein Mitglied "downloadingFile, serverAddress" geben beide zufällig schlechte Werte!

Jeder weiß, warum kann ich nicht auf dieses Objekt zugreifen?

Antwort

2

Das Problem liegt hier bei Ihnen nicht das Array und den Server und schlechte Namenskonvention von Init beibehalten. Es sieht so aus, als ob Ihre benutzerdefinierte Init-Methode nicht aufgerufen wird.

-(void) initWithServer:(NSURL*) server 
{ 
    downloadingFile = [NSMutableArray array]; 
    serverAddress = server; 
} 

Versuchen Sie, die folgenden Änderungen

//InternetIOProcess.h add 
-(id) initWithServer:(NSURL*) server; 

//InternetIOProcess.m change 
-(id) initWithServer:(NSURL*) server 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
     downloadingFile = [[NSMutableArray array] retain]; 
     serverAddress = [server retain]; 
    } 
    return self; 
} 

//MyAppDelegate.m 
downloader = [[InternetIOProcess alloc] initWithServer:[NSURL URLWithString:@"http://www.test.com"]]; 
+0

Die Eigenschaften für die NSMutableArray machen gesetzt zu halten. Der Initialisierer [NSMutableArray-Array] gibt jedoch ein Objekt zurück, das für die automatische Freigabe festgelegt ist. Ich würde vorschlagen, das nicht zu tun und stattdessen die Syntax zu verwenden: "[[NSMutableArray alloc] init]". Retain sollte impliziert werden. Das Objekt in dem Delegat wird nie beibehalten. – Luke

+0

Der Downloader im App-Delegaten wird automatisch durch den Aufruf von [InternetIOProcess alloc] beibehalten. Seine Methode initWithServer musste (basierend auf dem Namen) aufgerufen werden und das Array und die Serveradresse beibehalten. [[NSMutableArray array] behalten] und [[NSMutableArray alloc] init] würde den gleichen Zweck hier dienen – Joe

+0

Ja, aber mein Punkt ist es ist redundant zu nennen behalten. Warum wird der Downloader automatisch beibehalten? Ich sehe keine Eigenschaft, die Retain- oder Retain-Aufrufe festlegt. alloc + init wird nicht automatisch beibehalten. Einverstanden, dass init geändert werden musste. – Luke

1

Just checking, Ihre UIViewController enthält

#import "MyAppDelegate.h" 

und

#import "InternetIOProcess.h" 

Und Ihre MyAppDelegate enthält

#import "InternetIOProcess.h" 

Auch sind Sie Compiler-Warnungen zu bekommen?

1

Ist Downloader eine Eigenschaft mit dem Retain-Attribut in der Delegate-Klasse? Ich sehe nicht, dass Sie beibehalten angeben, wenn Sie die Instanz zuweisen.

1

Verwenden Sie in Ihrer Methode initWithServer: self.downloadingFile und self.serverAddress, damit die Objekte beibehalten werden.

Verwandte Themen