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?
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
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
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