以前,使用Objective-C我可以使用performSelector:以便在随机时间段之后重复一个动作,该动作可能在1-3秒之间变化.但由于我无法使用performSelector:在Swift中,我尝试过使用"NSTimer.scheduledTimerWithTimeInterval".它的工作原理是为了重复这个动作.但有一个问题.设置时间变量以调用将生成随机数的函数.但似乎NSTimer每次重复动作时都会使用相同的数字.
这意味着该动作不是随机执行的,而是在游戏开始时随机生成的一段时间之后执行,并且在整个游戏期间使用.
问题是:有没有办法设置NSTimer每次执行动作时创建一个随机数?或者我应该使用不同的方法?谢谢!
目标C中执行选择器的用途是什么?你可以告诉我执行选择器和响应选择器之间的区别吗?
我在库中有一个看起来像这样的方法:
- (id)initWithSomeObjects:(NSString *)something, ... NS_REQUIRES_NIL_TERMINATION;
Run Code Online (Sandbox Code Playgroud)
我真的想用数组而不是var args来调用它,因为我想传入的对象数量是可以改变的.
有没有办法,使用performSelector或NSInvocation或objc_msgSend或其他什么,我可以调用var args方法,参数来自数组?
每个人都知道ios在swift2.0中支持"performSelector"我想知道如何获得performSelector的返回值?
let returnValue:Unmanaged<AnyObject> = (self.dataSource?.performSelector("myselector:", withObject: self))!
let value : Int? = returnValue.takeRetainedValue() as? Int
Run Code Online (Sandbox Code Playgroud)
最后一行出现崩溃,如何在swift2.0中获取"performSelector"的值?
是否[myObject performSelector:@selector(something) withObject:nil];只是打电话一样[myObject performSelector:@selector(something)];?
我知道这两者有点类似,但两者之间必须有任何内部差异,
[anObject performSelector:@selector(thisMethod:) withObject:passedObject];
Run Code Online (Sandbox Code Playgroud)
相当于:
[anObject thisMethod:passedObject];
Run Code Online (Sandbox Code Playgroud)
请告诉我在编译,记忆等方面有什么不同.
我有一个带有以下接口的Rectangle对象:
@interface Rectangle : NSObject
@property int height, width;
-(void) setWidth:(int)w andHeight: (int)h;
@end
Run Code Online (Sandbox Code Playgroud)
我有一个实现,并有一个对象(比如说r)。当我打电话
[r setWidth: 5 andHeight: 6];
Run Code Online (Sandbox Code Playgroud)
通过验证时,我得到正确的结果[r height]。但是,当我使用performselector相同的方法时:
NSNumber *myNumber = [NSNumber numberWithInt:45];
[r performSelector:@selector(setWidth:andHeight:) withObject:myNumber
withObject:myNumber];
Run Code Online (Sandbox Code Playgroud)
调用会[r height]打印一些垃圾值(看起来像某个地址),预期值为45。我在做什么错?
我一直想知道以下几行代码
[self performSelector:@selector(myMethod) withObject:self afterDelay:1.0];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];
Run Code Online (Sandbox Code Playgroud)
nil何时将对象设置为self?在大多数情况下,我注意到要设置的对象nil.
我正在寻找一个具有类似于UIButton工作方式的"事件列表"的类,您可以在其中添加多个目标和选择器.
写一个很容易,但如果Apple已经提供了解决方案,我宁愿使用它而不是维护更多的代码.
注意:
这是一个非可视类,所以我真的不想使用任何UI特定的东西.
编辑:
我最终使用堆叠的NSDictionary实例滚动我自己的基本事件调度程序类.
@implementation ControllerBase
@synthesize eventHandlers;
- (id) init
{
self = [super init];
if (self!=NULL)
{
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[self setEventHandlers: dict];
[dict release];
}
return self;
}
-(void) addTarget: (id) target action:(SEL) selector forEvent:(NSString*) eventName
{
NSString* selectorString = NSStringFromSelector(selector);
NSMutableDictionary* eventDictionary = [eventHandlers objectForKey:eventName];
if (eventDictionary==NULL)
{
eventDictionary = [[NSMutableDictionary alloc] init];
[eventHandlers setValue:eventDictionary forKey:eventName];
}
NSArray* array = [NSArray arrayWithObjects:selectorString,target, nil];
[eventDictionary setValue:array forKey: [target description]];
}
-(void) removeTarget: …Run Code Online (Sandbox Code Playgroud) 您好,我在NSMutableArray上使用performSelector有一个棘手的问题.我有可能误解了performSelector的作用.基本上我有NSMutableArray与对象(所有这些都是基于我的类的对象,它继承自UIButton,但这并不重要,我猜)我需要向数组中的所有对象发送消息.
在我的类的头文件中,我已经声明了函数,它由selector调用.它看起来像这样:
-(void)scaleChangedWithANumber:(NSNumber *)scale;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我的数组包含3个对象.如果我逐项称呼它们,它的工作原理很完美:
NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];
ButtonOfElement *tmpButton1=[elementsButtonContainer objectAtIndex:0];
[tmpButton1 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
ButtonOfElement *tmpButton2=[elementsButtonContainer objectAtIndex:1];
[tmpButton2 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
ButtonOfElement *tmpButton3=[elementsButtonContainer objectAtIndex:2];
[tmpButton3 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试在数组上调用performSelector(我需要向数组中的所有对象发送消息):
NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];
[elementsButtonContainer performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
tmpNumber=nil;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0'
*** First throw call stack:
(0x34e456c3 0x370be97f 0x34e49227 0x34e47951 0x34d9f468 0x31d1 0x369a70eb 0x369a7447 0x369324d9 0x368f9c0d 0x36ae5649 0x3681df4f 0x3681c9b3 0x3682791f 0x368274eb …Run Code Online (Sandbox Code Playgroud) performselector ×10
objective-c ×8
ios ×5
iphone ×2
selector ×2
swift ×2
cocoa ×1
cocoa-touch ×1
nsinvocation ×1
nstimer ×1
random ×1
sprite-kit ×1
uikit ×1
unmanaged ×1