/ / Цели на обекта-C не се изпълняват - цел-c, multithreading, обект

Целевите C методи не се изпълняват - цел-c, multithreading, обект

Обръщам се с помощта на предмети, които да пуснафонови нишки, но когато се обадя на метод на обекти, за да се обадя на метода, който ще възбуди фонова нишка, нищо не се случва. Аз съм малко озадачен за това защо и изглежда, че функцията не е дори призована. Както и да е, тук е това, което имам:

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

Когато стартирам програмата, това е изходът ми (няколко пъти щракнах бутона)
2013-05-17 15: 30: 57.267 Открити обекти Кликнали.
2013-05-17 15: 30: 59.003 Открити обекти Кликнали.
2013-05-17 15: 30: 59.259 Открити обекти Кликнали.
2013-05-17 15: 30: 59.443 Открити обекти Кликнати.
2013-05-17 15: 30: 59.675 Открити обекти Кликнали.

Трябва да получавам съобщения, които да ми казват, чеThreader обектът е създаден и се подготвя за стартиране на фонова нишка, че нишката е възникнала и след 10 секунди, че нишката е готов да работи. И така, къде е очевидната ми грешка?

Отговори:

2 за отговор № 1

init не е конструктор, той е за настройка след изграждането. Трябва да имате предмета на класа, за да създадете потребителски модел, преди да можете да го изпратите init, и най-важното е, че трябва да зададете резултатите на вашата променлива.

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

threadedObject = [[Threader alloc] init];
}

Не можете да изпратите alloc към обект, който "не е клас, в който не отговарят. Единствената причина, че това не е трясък, е, че глобалите са инициализирани до 0 /NULL/nil, и [nil someMessage] не прави нищо.

Невъзлагането на резултатите на вашата променлива е същото като:

int x = 0;
x + 10;

Няма промяна xна стойност.

Освен това, изглежда, че няма ивир там, просто глобална променлива. Иварите трябва да влязат в блок за къдрици в главата на @implementation:

@implementation Threader
{
Threader * threadedObject;
}

// etc...

1 за отговор № 2

Ти никога Alloc предметът.............

Също така, това е любопитно:

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


@interface ViewController : UIViewController

- (IBAction)StartBackgroundThreadButtonClicked:(id)sender;

@end


Threader* threadedObject;

Къде точно декларирахте нишката? По-горе? Използвайте iVar или, по-добре, имот за него!


1 за отговор № 3

Няколко реакции:

  1. Покажете ни къде вашето определение и разпределение / начало на threadedObject.

  2. Не съм сигурен какъв бизнес проблем се опитвате да разрешите, но това мирише на предшественика на някакъв обичай NSOperation решение. Операционните опашки са идеално подходящи за тези видове реализации.

    Ще бъда склонен да подклас NSOperation когато се опитвате да направите нещо подобно. Вижте потребителски обект NSOperation в Ръководство за програмиране за съпътстващи събития.

  3. Аз предлагам да използвате camelCase за вашия метод и имена на променливи.

  4. Ако кажете с това, щях да ви отклоня от името "нишка", тъй като това може да означава, че правите нещо с NSThread, които не сте.