0

我正在搞乱使用对象来启动后台线程,但是当我调用对象方法来调用将产生后台线程的方法时,什么也没有发生。我有点不明白为什么,看起来 -init 函数甚至没有被调用。无论如何,这就是我所拥有的:

视图控制器.h

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


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

@end

视图控制器.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

线程器.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 ThreadedObjects Clicked。
2013-05-17 15:30:59.003 单击了 ThreadedObjects。
2013-05-17 15:30:59.259 点击了 ThreadedObjects。
2013-05-17 15:30:59.443 单击了 ThreadedObjects。
2013-05-17 15:30:59.675 单击了 ThreadedObjects。

我应该收到消息,告诉我 Threader 对象已创建,并且它正准备启动后台线程,该线程已生成,然后在 10 秒后,该线程已完成运行。那么,我明显的错误在哪里?

4

3 回答 3

2

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

此外,您似乎没有 ivar,只有一个全局变量。Ivars 需要在@implementation:

@implementation Threader
{
    Threader * threadedObject;
}

// etc...
于 2013-05-17T19:57:39.810 回答
1

你永远不会分配对象......

另外,这很奇怪:

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


@interface ViewController : UIViewController

- (IBAction)StartBackgroundThreadButtonClicked:(id)sender;

@end


Threader* threadedObject;

你到底在哪里声明了线程对象?和上面一样吗?使用 iVar 或更好的属性!

于 2013-05-17T19:52:17.563 回答
1

几个反应:

  1. 告诉我们你的定义和分配/初始化在哪里threadedObject

  2. 我不确定您要解决什么业务问题,但这闻起来像是某些自定义NSOperation解决方案的先驱。操作队列非常适合这些类型的实现。

    NSOperation在尝试做这样的事情时,我倾向于子类化。请参阅并发编程指南中的自定义 NSOperation 对象。

  3. 我建议使用 camelCase 作为您的方法和变量名称。

  4. 如果您这样说,我会引导您远离“线程”名称,因为它可能暗示您正在使用 做某事NSThread,而您不是。

于 2013-05-17T20:03:29.130 回答