【发布时间】:2015-06-16 13:25:05
【问题描述】:
我尝试在早上通过委托实现警报和人员关系,并在每个环使用 performSelector:@selector withObject:nil afterDelay 后模拟延迟。但是没有执行函数调用,但是当我简单地使用 performSelector: - 它工作正常。全部在主线程中。有人可以解释一下吗?这是我的代码:
#import <Foundation/Foundation.h>
@protocol MyDelegateProtocol <NSObject>
@optional
- (void) wakeUp;
- (void) standUp;
@end
#import <Foundation/Foundation.h>
#import "myDelegateProtocol.h"
@interface Alarm : NSObject
@property (nonatomic, weak) id <MyDelegateProtocol> delegate;
@property (nonatomic, assign) NSUInteger ringsLeft;
@property (nonatomic, assign) SEL selector;
- (void) setAlarm: (CGFloat) delay;
- (void) fiveMinutesMore;
- (id) initWithRings: (NSUInteger) rings;
- (void) doAlarm;
@end
#import "Alarm.h"
@implementation Alarm
@synthesize delegate;
@synthesize selector;
- (id) initWithRings:(NSUInteger)rings
{
self = [super init];
if (self) {
self.ringsLeft = rings;
}
return self;
}
- (void)setAlarm:(CGFloat)delay {
if (delegate) {
if (self.ringsLeft>0) {
self.ringsLeft--;
selector = @selector(wakeUp);
} else {
selector = @selector(standUp);
}
}
if ([delegate respondsToSelector:selector]) {
[self performSelector:@selector(doAlarm)];
// [self performSelector:@selector(doAlarm) withObject:nil afterDelay:delay];
}
}
- (void)doAlarm {
[delegate performSelector:selector];
}
- (void)fiveMinutesMore {
[self setAlarm:1.0];
}
@end
#import <Foundation/Foundation.h>
#import "Alarm.h"
@interface Person : NSObject <MyDelegateProtocol>
@property (nonatomic,assign) NSUInteger chanceToWakeUp;
@property (nonatomic,strong) Alarm *myAlarm;
- (void) goSleepFor: (CGFloat) seconds;
- (id) init;
@end
#import "Person.h"
@implementation Person
@synthesize chanceToWakeUp;
@synthesize myAlarm;
-(void) goSleepFor:(CGFloat)seconds
{
NSLog(@"Going for a sleep");
[myAlarm setAlarm:seconds];
}
-(void) wakeUp
{
NSLog(@"Ringing...");
NSUInteger randomNumber = arc4random_uniform(6);
if (randomNumber>chanceToWakeUp) {
chanceToWakeUp++;
NSLog(@"Person takes five minutes more to sleep");
[myAlarm fiveMinutesMore];
} else {
[self standUp];
}
}
-(void) standUp
{
NSLog(@"Person stand's up");
}
-(id) init
{
self = [super init];
if (self) {
chanceToWakeUp=0;
myAlarm = [[Alarm alloc] initWithRings:5];
myAlarm.delegate=self;
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *tiredPerson = [[Person alloc] init];
[tiredPerson goSleepFor:10.0f];
}
return 0;
}
【问题讨论】:
-
创建一个名为
selector的ivar 如果这个想法很糟糕,它只会引起混乱。方法名称应该说明它们的作用。 `@synthesize1 也不是必需的,它会自动发生并创建一个名称前加“_”的 ivar,使用 self.ivar 进行访问。 -
只有 sleep(delay) 与 #import "unistd.h" 一起使用。 [self performSelector:@selector(doAlarm) withObject:nil afterDelay:delay];和 [NSTimer timerWithTimeInterval:delay target:self selector:@selector(doAlarm) userInfo:nil repeats:NO];完全有效
标签: objective-c performselector