比较Obj-C中的对象,为什么它们不匹配?

时间:2015-09-18 20:33:31

标签: ios objective-c

BOUNTY NOTICE

您好!我开始对这个问题表示赏心悦目,因为人们不会阅读整个问题,也不会试图理解问题的根源。或者,不知道这里发生了什么。需要更详细的方法..谢谢!

END

当我使用自定义任务调用NSURLSession时 - 我将这些任务存储在字典中。当我收到委托电话时,我需要找到它的任务。我是这样做的:

task._taskDelegate

它之前对我有用(肯定是iOS7),但现在这种比较从未成功过。我还从当地人那里获取了截图,看到了对象ID的突出显示。是的,我不是C开发人员所以它可能与问题有关:)我认为这是由于指针问题..

当执行// *****的代码行时 - 我得不到匹配。此函数始终返回0.

enter image description here

enter image description here

enter image description here

修改

似乎与PROXY相关的问题。当我创建和存储NSURLSession时,iOS实际上返回NSProxy。 NSUURLSessionTask也是如此。 这是全新的东西吗?如何根据您在当地人看到的内容来比较这些对象?我需要得到{{1}},但它没有曝光..

6 个答案:

答案 0 :(得分:3)

目前还不清楚如何向operations添加项目。

这一行具有误导性:

for (NSString *key in self.operations)

因为在你的调试跟踪中,你的密钥似乎实际上是operations中的NSNumbers。

为什么不尝试使用taskIdentifier。它应该唯一地标识会话中的任务。

- (NSInteger)getOperationIdentifierForTask:(NSURLSessionTask*)task
{
    NSNumber * value = self.operations[@(task.taskIdentifier)];

    if( value == nil )
         return 0;

    return value.integerValue;
}

答案 1 :(得分:2)

您不能在非原始对象上使用原始相等性检查==。您应该使用isEqual:。在子类中重写它,并比较项目中要求相同的任何属性以确保相等。

在您的子类中执行类似的操作:

-(BOOL)isEqual:(id)object{
    if([object isKindOfClass:[YourSubClass class]]){
        YourSubClass *otherObject = (YourSubClass*)object;

        NSInteger currentDistinctiveNumber = [self.someDistinctiveProperty integerValue];
        NSInteger otherDistinctiveNumber = [otherObject.someDistinctiveProperty integerValue];
        if(currentDistinctiveNumber == otherDistinctiveNumber){
            return YES;
        }
    }

    return NO;
}

答案 2 :(得分:1)

如果您确定它在iOS 7中有效,并且我在这里猜测,那么在转换为之前您没有遇到任何问题iOS 9 ,我想说这个问题可能是由Apple的新App Transport Security引起的。

原因:

在iOS 9和OS X 10.11中,Apple推出了App Transport Security(ATS),这是对应用程序网络连接的一组低级限制。这些限制中最明显的一个是要求应用程序不再通过普通HTTP建立连接;相反,除非另有明确说明,否则操作系统会强制使用HTTPS。

根据您提供的屏幕截图判断,您指向的网址似乎是基于http://的网址,而不是https://。我这样说是因为您的问题似乎始于HTTPTaskOperation

修复:

将以下词典添加到您应用的.plist文件中:

enter image description here

这完全取消了Apple的新安全(ATS)

如果这是一个问题,或者它仍然不起作用,您需要调整例外以满足您的项目需求。查看之前的链接,或阅读Apple的App Transport Security documentation

如果不是iOS 9 ATS问题

〜添加〜

This堆栈溢出问答给出了以下解释:

如果您正在使用基于委托的实现,那么事情会很快变得非常毛茸茸。这是因为NSURLSession的一个可理解的(但令人难以置信的烦人)功能,即任务级代表在会话级实现。 (考虑一下:需要不同处理的两个不同请求是在共享会话对象上调用相同的委托方法.Egad!)

在一个操作中包装一个基于委托的NSURLSessionTask可以完成(...)但它涉及一个笨拙的过程,让会话对象维护一个字典交叉引用任务标识符和任务操作对象,让它通过这些任务委托方法传递给任务对象,然后使任务对象符合各种NSURLSessionTask委托协议。它需要相当多的工作量,因为NSURLSession并没有在会话上提供maxConcurrentOperationCount风格的功能(更不用说其他NSOperationQueue优点,如依赖项,完成块等) < / p>

答案 3 :(得分:0)

Objective-C中的“==”运算符检查两个变量是否指向完全相同的对象。如果您有2个包含相同数据的不同对象,则测试将失败。

正如其他人所说,你应该为你的自定义子类实现isEqual方法,或者如果你没有一种简单的方法来为你的类子类化/添加一个类别,你可以创建一个全局函数,其中包含2个您的对象作为参数并返回一个BOOL,告诉您它们是否等效。

答案 4 :(得分:0)

&#39; ==&#39;在objective-c测试对象的引用相等性。这意味着它检查两个对象是否是相同的对象,如果它们的值相同则不会。尝试使用对象isEqualTo:function。如果它是您自己的对象,请编写一个isEqualTo:函数来测试该对象中某个值的相等性。

答案 5 :(得分:0)

也许您可以在taskDescription的{​​{1}}属性中为每个任务存储唯一标识符,然后再将其存储到您的操作中,然后使用该值进行比较。该值应保持不变,允许您避免传递的对象之间的指针比较。