- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法将我们的云数据库服务的静态库移植到 ARC。
我已经到了编译和运行的阶段,但它永远不会回调委托(delegate)。
我有 2 个类,一个代理类和一个 APIOperation。
APIOperation 是 NSOperation 的子类,它使用 NSURLConnection 从 Web API 获取数据。
代理有一个 NSOperationQueue,基本上是所有 APIOperation 调用的委托(delegate)。
使用模型如下:
代码如下:
代理类:
@implementation theProxy
@synthesize callbackSelector,delegate,opQueue;
-(theProxy*)init{
opQueue = [[NSOperationQueue alloc]init];
return self;
}
- (void) apiOperation:(APIOperation*)operation didCompleteWithResult:(NSArray*)theResult{
SEL selector = [operation callbackSelector];
if ([delegate respondsToSelector:selector]) {
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:[[delegate class] instanceMethodSignatureForSelector:selector]];
[inv setTarget:delegate];
[inv setSelector:selector];
theProxy* tmp = self;
[inv setArgument:&tmp atIndex:2];
[inv setArgument:&operation atIndex:3];
[inv setArgument:&theResult atIndex:4];
[inv invoke];
}
}
- (void) apiOperation:(APIOperation*)operation didFailWithError:(NSString*)theError{
if ([delegate respondsToSelector:@selector(API:apiOperation:didFailWithError:)]) {
[delegate API:self apiOperation:operation didFailWithError:theError];
}
}
-(void)cancelAllOperations{
[opQueue cancelAllOperations];
}
- (void)dealloc
{
[opQueue cancelAllOperations];
[opQueue release], opQueue = nil;
delegate = nil;
//[delegate release]; delegate should not be retained.
[super dealloc];
}
APIOperation 类(大大简化):
@implementation APIOperation
@synthesize delegate,APIKey,secretKey,debugMode,callbackSelector,successCallbackMethodSignature,errorCallbackMethodSignature,delegateCallbackMethodSignature,tag,APIServer,requestProcessingTime,requestReceivedTime,responseCode,responseMessage,timestamp,requestRoundTripTime,requestStartMicroTime,useSSL;
-(void) main{
receivedData = [NSMutableData data];
connFinished = NO;
// create the connection with the request
// and start loading the data
theConnection=[[NSURLConnection alloc] initWithRequest:[self buildRequest] delegate:self];
if (theConnection) {
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!connFinished);
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
id pList = [NSPropertyListSerialization propertyListFromData:receivedData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
theResponse = (NSDictionary*) pList;
if ([delegate respondsToSelector:@selector(apiOperation: didCompleteWithResult:)]) {
NSArray* theResultsArray = [theResponse objectForKey:@"payload"];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:successCallbackMethodSignature];
[inv setTarget:delegate];
[inv setSelector:@selector(apiOperation: didCompleteWithResult:)];
KSAPIOperation* tmp = self;
[inv setArgument:&tmp atIndex:2];
[inv setArgument:&theResultsArray atIndex:3];
[inv performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES];
}
}
@end
现在正如我所说,这一直有效到 connectionDidfinishLoading 中的“if([delegate respondsToSelector...”行。那时它总是返回 false。现在假设这与 ARC 有关,我已经检查了委托(delegate)不为空并且值在那里,委托(delegate)属性也在 APIOperation.h 中声明为:
@property (unsafe_unretained) id<KSAPIOperationDelegate,NSObject> delegate;
如果我删除 respondsToSelector 检查,则应用程序会在 main() 中崩溃,并显示以下回溯:
#0 0x0156b09b in objc_msgSend ()
#1 0xbfffde10 in ?? ()
#2 0x0132d437 in -[NSInvocation invoke] ()
#3 0x013c8e72 in -[NSObject performSelector:withObject:] ()
#4 0x009369ef in __NSThreadPerformPerform ()
#5 0x0139b97f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#6 0x012feb73 in __CFRunLoopDoSources0 ()
#7 0x012fe454 in __CFRunLoopRun ()
#8 0x012fddb4 in CFRunLoopRunSpecific ()
#9 0x012fdccb in CFRunLoopRunInMode ()
#10 0x012b0879 in GSEventRunModal ()
#11 0x012b093e in GSEventRun ()
#12 0x0001ea9b in UIApplicationMain ()
#13 0x00002a58 in main (argc=1, argv=0xbfffed50) at /Users/MikeW/Desktop/ARC test proj/lib1.0Test/lib1/main.m:16
#14 0x000029b5 in start ()
非常感谢您提供的任何帮助。
谢谢
迈克
最佳答案
这与 ARC 没有任何关系。
如果它报告它没有响应选择器,那么它没有。弄清楚。您很可能在选择器中输入了错误(例如,它们区分大小写)。或者代理实际上不是您认为的那样。
顺便说一句,我会从您的选择器中删除空格,例如@selector(apiOperation: didCompleteWithResult:)
看起来是错误的,即使编译器喜欢它也是如此。
关于iphone - iOS 5.0 respondsToSelector 在 NSOperation 中总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8944501/
class test { public static void main(String[] args){ Object o1 = new Object(); O
我以为我理解了 Python 中的这两个单例值,直到我看到有人在代码中使用 return l1 or l2,其中 l1 和 l2 都是链表对象,并且(s)他想如果不为 None 则返回 l1,否则返回
这个问题在这里已经有了答案: Why does the expression 0 >> (True == False) is False True >>> True == (False is Fals
为什么在 Python 中它是这样评估的: >>> False is False is False True 但是当用括号尝试时表现如预期: >>> (False is False) is False
我有一个名为“apple”的表,我编写了以下查询: select name, count(name), case when istasty is null then fal
python boolean 逻辑中的运算符优先级 print(False==True or False) #answer is True print(False==(False or True))#
请不要看条件,因为它们在这里是为了便于理解行为 为什么 result 等于 true ? boolean result = false && (false)?false:true; 我知道我们可以通过
乍一看,这篇文章可能看起来像是重复的,但事实并非如此。相信我,我已经查看了所有 Stack Overflow,但都无济于事。 无论如何,我从 Html.CheckBoxFor 得到了一些奇怪的行为。
这个问题在这里已经有了答案: python operator precedence of in and comparison (4 个答案) 关闭 6 年前。 我的一位前辈演示了它,我想知道这是否是
我最近参加了 Java 的入门测试,这个问题让我很困惑。完整的问题是: boolean b1 = true; boolean b2 = false; if (b2 != b1 != b2) S
为什么 {} == false 评估为 false 而 [] == false 评估为 true在 javascript 中? 最佳答案 这是根据 Abstract Equality Comparis
这个问题在这里已经有了答案: Why does (1 in [1,0] == True) evaluate to False? (1 个回答) 关闭7年前。 为什么使用括号时这些语句按预期工作: >>
我试过搜索这个,但我真的不知道如何表达它以查看是否有其他人发布了答案。 但是,我正在制作一个国际象棋游戏和一个人工智能来配合它,这是非常困难的,我的问题是当我检查两个棋子是否在同一个团队时我必须做 (
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
为什么 为 false || null 返回与 null || 不同的结果错误? 我可以安全地依赖 return myVar || false 如果 myVar 为 null 或 false,则返回
我正在尝试遵循 NHibernate 教程,“你的第一个基于 NHibernate 的应用程序:修订 #4”在 NHibernate Forge。 但线路:new SchemaExport(cfg).
这个问题在这里已经有了答案: Empty list boolean value (3 个答案) 关闭 4 年前。 我是 Python 的新手,不理解以下行为: 为什么要声明 [] == False
以下函数循环访问对象的值。如果值为空this.hasInvalidValue设置为true ,如果不为空 this.hasInvalidValue设置为false : user: { email:
所以我正在玩 java.lang.reflect 东西并尝试制作类似 this 的东西。这是我的问题(可能是一个错误): 将字段设置为 true 的方法的代码: private static void
当我在编程时,我的 if 语句出现了意想不到的结果。 这个代码警报怎么会是真的?我在 W3S 没有找到任何可以帮助我的东西,我真的很想知道为什么这些警报是“正确的” window.alert(fals
我是一名优秀的程序员,十分优秀!