/ / Nie działają metody Objective-C - cel-c, wielowątkowość, obiekt

Metody Objective-C nie działają - cel-c, wielowątkowość, obiekt

Wkurzam się przy użyciu obiektów do uruchomieniawątki w tle, jednak gdy wywołuję metodę obiektów, aby wywołać metodę, która odrodzi wątek tła, nic się nie dzieje. Jestem trochę zaskoczony, dlaczego i wygląda na to, że funkcja -init nie jest nawet wywoływana. Tak czy inaczej, oto co mam:

ViewController.h

#import <UIKit/UIKit.h>
#import "Threader.h"


@interface ViewController : UIViewController
@property(nonatomic, strong) Thread* threadedObject;
- (IBAction)StartBackgroundThreadButtonClicked:(id)sender;

@end

ViewController.m

#import "ViewController.h"
#import "Threader.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

_threadedObject = [[Threader alloc]init];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)StartBackgroundThreadButtonClicked:(id)sender {

NSLog(@"Clicked.");
[_threadedObject RunInBackground];


}
@end

Threader.h

#import <Foundation/Foundation.h>

@interface Threader : NSObject
@property(nonatomic) bool IsFinishedRunning;
@property(nonatomic) bool IsThreading;

//Constructor and Destructor
-(id)init;
-(void)dealloc;

-(void)RunInBackground;

-(void)WaitForTenSeconds;

@end

Threader.m

#import "Threader.h"

@implementation Threader

//constructor
-(id)init{
[super init];
if(self != nil)
{
_IsFinishedRunning = NO;
_IsThreading = NO;
}


return self;
}



//destructor
-(void)dealloc{
[super dealloc];
}


//Runs a thread in the background
-(void)RunInBackground{
NSLog(@"Initiating thread...");
[self performSelectorInBackground:@selector(WaitForTenSeconds) withObject:nil];

}

//Waits for 10 seconds, then sets IsFinishedRunning to YES
-(void)WaitForTenSeconds{
NSLog(@"Starting to run in the background.");
_IsThreading = YES;
sleep(10);
_IsFinishedRunning = YES;

NSLog(@"Finished running in the background.");

}


@end

Po uruchomieniu programu jest to moje wyjście (kilka razy kliknąłem przycisk)
2013-05-17 15: 30: 57.267 Kliknięto ThreadedObjects.
2013-05-17 15: 30: 59.003 Kliknięto ThreadedObjects.
2013-05-17 15: 30: 59.259 Kliknięto ThreadedObjects.
2013-05-17 15: 30: 59.443 ThreadedObjects Clicked.
2013-05-17 15: 30: 59,675 ThreadedObjects Clicked.

Powinienem otrzymywać komunikaty mówiące mi, żeUtworzono obiekt wątku, który przygotowuje się do uruchomienia wątku tła, wątku został utworzony, a następnie po 10 sekundach, że wątek jest wykonywany. Więc, gdzie jest mój rażący oczywisty błąd?

Odpowiedzi:

2 dla odpowiedzi № 1

init nie jest konstruktorem, służy do konfiguracji po zakończeniu budowy. Przed wysłaniem obiektu klasowego musisz utworzyć obiekt initi, co najważniejsze, musisz przypisać wyniki do swojej zmiennej.

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

threadedObject = [[Threader alloc] init];
}

Nie możesz wysłać alloc do obiektu, który nie jest klasą, instancje nie reagują na nie. Jedynym powodem, dla którego to nie ulega awarii, jest to, że globale są inicjowane do 0 /NULL/nil, i [nil someMessage] nic nie robi.

Nieprzypisywanie wyników do zmiennej jest takie samo jak:

int x = 0;
x + 10;

Nie ma żadnych zmian x"s wartość.

Poza tym, nie wydaje ci się, że masz tam ivar, tylko globalną zmienną. Ivars musi wejść do bloku z kręconymi klamrami na czele @implementation:

@implementation Threader
{
Threader * threadedObject;
}

// etc...

1 dla odpowiedzi nr 2

Ty nigdy przydziel obiekt.............

Jest to również ciekawe:

#import <UIKit/UIKit.h>
#import "Threader.h"


@interface ViewController : UIViewController

- (IBAction)StartBackgroundThreadButtonClicked:(id)sender;

@end


Threader* threadedObject;

Gdzie dokładnie zadeklarowałeś threadedObject? Jak wyżej? Użyj iVar lub, lepiej, właściwość dla niego!


1 dla odpowiedzi nr 3

Kilka reakcji:

  1. Pokaż nam, gdzie Twoja definicja i przydzielić / init of threadedObject.

  2. Nie jestem pewien, jaki problem biznesowy próbujesz rozwiązać, ale to pachnie jak prekursor jakiegoś zwyczaju NSOperation rozwiązanie. Kolejki operacyjne idealnie nadają się do tego rodzaju implementacji.

    Byłbym skłonny do podklasy NSOperation kiedy próbuję zrobić coś takiego. Zobacz niestandardowy obiekt NSOperation w Przewodnik programowania współbieżności.

  3. Sugeruję użycie camelCase dla twojej metody i nazw zmiennych.

  4. Jeśli powiesz o tym, odciągnę cię od nazwy "wątku", ponieważ może to oznaczać, że robisz coś z NSThread, którym nie jesteś.