我试图让我的应用程序在延迟后执行一个动作,但是必须在用户与a进行交互/滚动时完成UIScrollView.
我不确定为什么既不会performSelector:withObject:afterDelay也scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:不会解雇.是因为他们是在后台线程吗?
有什么建议或帮助吗?
在下面的摘录中,
/*A ClassName with instanceMethod and ClassMethod */
-(void)instanceMethod;
+(void)ClassMethod;
/*To call a instance method in background */
ClassName class1obj = [ClassName alloc] init];
[class1obj performSelectorInBackground:@selector(instanceMethod) withObject:nil];
Run Code Online (Sandbox Code Playgroud)
同样,如何使用后台调用ClassMethod performSelectorInBackground?
如果可能,请解释!请伙计们携手..
我正在使用scheduledTimerWithTimeInterval进行函数调用.我只是检查特定Web服务的xml解析是否完成,并在获得成功响应后使didEndElement方法中的计时器失效.
timerForStopWebService = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(stopWS) userInfo:nil repeats:NO];
Run Code Online (Sandbox Code Playgroud)
现在我面临iOS 5.0的问题,并且在其他iOS版本中工作正常.在iOS 5.0中,即使我使其无效,也可以随时调用函数stopWS.如果你有解决方案,请告诉我.
现在我正在实现具有延迟的performselector并在stopWS中设置布尔变量以识别解析是否已完成.我只是想知道这有什么重大区别吗?这个解决方案能解决我的问题吗?
如果有其他方式,请建议我,谢谢.
我收到了警告
PerformSelector可能导致泄漏,因为其选择器未知
在代码中:
- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
assert([NSThread isMainThread]);
if([delegate respondsToSelector: selector])
{
if(arg != NULL)
{
//this line the warning
[delegate performSelector: selector
withObject: arg
withObject: err];
}
else
{
//this line the warning
[delegate performSelector: selector
withObject: err];
}
}
else
{
NSLog(@"Missed Method");
}
}
Run Code Online (Sandbox Code Playgroud)
标题:
@interface Topscore : UIViewController <NSObject> {
//
}
Run Code Online (Sandbox Code Playgroud) 我在我的代码中有一个与ARC自动插入objc_retains有关的奇怪崩溃.
我有以下两个类:
@interface MenuItem : NSObject
@property (weak, nonatomic) id target;
@property (unsafe_unretained, nonatomic) SEL action;
@property (strong, nonatomic) id object;
- (instancetype)initWIthTarget:(id)target action:(SEL)action withObject:(id)object;
- (void)performAction;
@end
@implementation MenuItem
- (void)performAction
{
if (self.target && self.action)
{
if (self.object)
{
[self.target performSelector:self.action withObject:self.object];
}
else
{
[self.target performSelector:self.action];
}
}
}
@end
@interface Widget : NSObject
- (void)someMethod:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
在某些时候,我实例化一个MenuItem:
MenuItem *item = [MenuItem alloc] initWithTarget:widget action:@selector(someMethod:) object:nil];
Run Code Online (Sandbox Code Playgroud)
然后我performAction在其他地方调用菜单项:
[item performAction];
Run Code Online (Sandbox Code Playgroud)
在执行中someMethod我遇到了崩溃:
@implementation Widget
- …Run Code Online (Sandbox Code Playgroud) 这是SO中已经回答的问题,但我无法在Apple文档中找到它.你能指出我正确的方向吗?
在以下主题中
在将对象传递给-performSelector之前,我是否必须保留一个对象:withObject:afterDelay:?
对performSelector的保留计数的影响:withObject:afterDelay:inModes
是调用performSelector的对象:withObject:afterDelay是否被NSRunLoop保留?
默认行为似乎如下:它保留接收器和参数.
我正在使用以下代码
[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData];
Run Code Online (Sandbox Code Playgroud)
哪里userData是自动释放的对象.
记录保留计数(我知道它可能无效)传入的数据会增加其保留计数.在委托上调用方法时,保留计数不等于1.
所以,我的问题是:我是否需要执行一些内存管理以避免泄漏或者我是否必须相信Apple的东西?在这里,我作为一个不可知论者说话,因为我找不到合适的文档.
先感谢您.
memory-management objective-c retain nsobject performselector
对不起新手问题(也许).我正在为ios开发一个应用程序,我正在尝试从主线程执行外部xml读取,以便在调用正在进行魔术时不冻结ui.
这是我知道使进程不在目标c的主线程中执行的唯一方法
[self performSelectorInBackground:@selector(callXml)
withObject:self];
Run Code Online (Sandbox Code Playgroud)
所以我把我的电话封装成一个函数
- (void)callXml{
[RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
}
Run Code Online (Sandbox Code Playgroud)
现在我必须使字符串indXML成为函数的参数,以便根据需要调用不同的xml.就像是
- (void)callXml:(NSString *) name{
[RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对performSelector的调用如何改变?如果我以通常的方式做到这一点,我会得到语法错误:
[self performSelectorInBackground:@selector(callXml:@"test")
withObject:self];
Run Code Online (Sandbox Code Playgroud) 我正在为iPhone编写客户端 - 服务器应用程序.我有一个关于线程的问题.当我从设备访问我的在线数据库时,我需要在单独的线程上执行此操作以不冻结UI /主线程.但是当响应我从数据库中获取的数据时,我在主线程上调用此方法:performSelectorOnMainThread.问题是,这只允许我向方法(WithObject)发送一个参数/对象,有时我有更多我想传递的参数.关于它的另一件事是我必须通过这一个对象.如果我发现应用程序崩溃,我无法通过nil.
这是我今天的代码..我担心我正在使用这些方法并以错误的方式进行操作.
- (IBAction)testServerAction:(id)sender {
[self.imageView setHidden:YES];
[self.activityView setHidden:NO];
[self.activityView startAnimating];
dispatch_queue_t testServer = dispatch_queue_create("Test-Server-Thread", NULL);
dispatch_async(testServer, ^{
if ([self.arrayWithServerConnections count] > 0)
{
NSString *messageToShow;
if ([self testServerMethod])
{
messageToShow = @"Server is working!";
[self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
}else
{
messageToShow = @"Server is NOT working!";
[self performSelectorOnMainThread:@selector(showMessageBoxWithString:) withObject:messageToShow waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(threadedUIActivityRemover:) withObject:nil waitUntilDone:YES];
}
}
});
dispatch_release(testServer);
}
-(void)threadedUIActivityRemover:(NSString *)string
{
[self.imageView setHidden:NO];
[self.activityView setHidden:YES];
[self.activityView stopAnimating];
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗,除了performSelectorOnMainThread还有什么可以指向我,这更好吗?
正如你所看到的,在这个例子中我将nil传递给NSString参数,因为我必须传递一些东西,如果我没有NSString作为方法中的arg,应用程序在传递nil时崩溃evan ..为什么这个?请让我对此更清楚一点! …
在我的iPhone应用程序中,我有几个地方可以做
[object performSelector: withObject: afterDelay:]
呼叫.所有都导致相同的方法.现在,在那个方法中,我想只在最近调用它时执行一些代码.如果它是第一个,我可以做,[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(thisMethod) object:nil]并确保它被调用一次.
但是,有没有办法判断是否有其他方法调用等待执行?
我可以在这个类中使用一个计数器,每次我在延迟后设置此执行时都会递增,然后在每次调用开始时递减它,并且只有在此计数器归零时才执行代码.但我想知道这是否是最好的/可接受的方法......
我必须在类(不是实例)上按名称执行选择器并使用其返回值:
id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1];
Run Code Online (Sandbox Code Playgroud)
选择器创建Class的新实例.我需要使用返回的实例.显然,我得到通常的performSelector可能会导致泄漏,因为它的选择器是未知的警告,因为这个项目是用ARC编译的.
如果我理解正确(从这里和其他人的答案),在这个实例中,performSelector 将导致泄漏(如果我错了,请纠正我,然后我可以禁用警告并完成它).选择器实现如下:
+ (id) objectWithFile:(NSString*)p1
{
return [NSKeyedUnarchiver unarchiveObjectWithFile:p1];
}
Run Code Online (Sandbox Code Playgroud)
当我必须从字符串使用选择器并且选择器创建并返回对象的新实例时,我有什么选择?
我考虑过NSInvocation但是它的getReturnValue方法要求我提供我自己分配的缓冲区,其中存储了返回值.我不确定这是否适用于ARC和类方法,或者我是否只需要将__bridge_transfermalloc的返回值缓冲区转换为,id并且这就是它的全部内容.
memory-leaks objective-c automatic-ref-counting performselector
performselector ×10
objective-c ×8
ios ×4
iphone ×3
xcode ×2
cocoa ×1
cocoa-touch ×1
ios5 ×1
memory-leaks ×1
nsobject ×1
nstimer ×1
retain ×1
uiscrollview ×1