在ARC之前,我有一个"X可能没有响应xxx" 警告,这是一个非常无害的警告,不会阻止它编译.现在,我正在尝试将我的项目转换为ARC,并且我有一个"没有可见的@interface for X声明选择器xxx" 错误,这会阻止它编译.
我确切地知道我在做什么,为什么警告在那里,我可以告诉你程序是正确的.以前,编译器编译它没有问题,现在不应该停止编译.
确实,类X的接口没有声明那个选择器,但是X是一个动态处理任何发送给它的选择器的消息的类forwardInvocation:(这是关于Objective-C的美妙事物之一),所以它的接口不可能声明可以在其上调用的所有选择器.并且选择器在某处声明,而不是在X上.
NSInvocation-retainArguments当你不NSInvocation立即运行时,它的方法很有用,但是稍后会这样做; 它保留了对象参数,因此它们在此期间保持有效.
众所周知,应该复制块参数而不是保留.我的问题是,是否-retainArguments知道复制而不是在块类型时保留参数?文档并没有表明它确实如此,但它似乎是一件容易和明智的事情.
更新: iOS 7中的行为似乎已经发生了变化.我刚刚对此进行了测试,并且在iOS 6.1和之前,-retainArguments没有复制块类型的参数.在iOS 7及更高版本中,-retainArguments复制块类型的参数.文档-retainArguments已更新,说它复制块,但它没有说明行为何时发生变化(这对支持旧操作系统的人来说真的很危险).
我以前从未听说过这个术语bitcode,我甚至不知道从哪里开始研究如何解决这个问题.
我正在使用Xcode 7 beta 3并且我已经成功上传了我的应用程序3次,但每次上传它时,它都会将状态更改为 invalid binary
我从App Store团队收到了一封电子邮件说这个
"无效的可执行文件 - 可执行文件'ESUHSD.app/ESUHSD'包含bitcode."
我不知道你需要了解哪些关于应用程序的信息,所以我希望得到任何帮助将不胜感激!
ARC适用于在extern"BCPL"块中声明的Objective-C指针类型,块指针类型和[开始Apple 8.0,LLVM 3.8] BPTR.
这些"在外部"BCPL"块"中声明的"BPTR"是什么?
根据didReceiveRemoteNotification,在后台,我们曾经能够通过点击推送通知上的操作按钮(或者在推送通知上滑动,取决于用户如何看到推送通知)来执行-application:didReceiveRemoteNotification:然后检查来处理用户打开应用程序在方法内部,应用程序是否applicationState未激活.
在iOS 7中,有新的remote-notification后台模式,允许应用程序在向用户显示远程通知时执行后台获取(用户无需对通知执行任何操作).要支持此模式,您应该实现该-application:didReceiveRemoteNotification:fetchCompletionHandler:方法.
文档-application:didReceiveRemoteNotification:说明如果您的应用程序委托实现该application:didReceiveRemoteNotification:fetchCompletionHandler:方法,那么"app对象将调用该方法而不是此方法".这意味着我们不能再-application:didReceiveRemoteNotification:用来处理远程通知,因为它不会被调用.
我们应该把处理逻辑放进去application:didReceiveRemoteNotification:fetchCompletionHandler:,但之前处理它的技巧不再有意义 - 以前,我们依赖的事实是,-application:didReceiveRemoteNotification:当应用程序不活动时调用的唯一方法是用户点击了打开应用程序的通知上的操作按钮.但是,现在,remote-notification后台模式的重点在于,application:didReceiveRemoteNotification:fetchCompletionHandler:每次收到远程通知时,它都可以在后台调用,然后用户对其执行任何操作.
那么,我们现在怎样才能告诉用户何时使用通知上的操作按钮打开应用程序?
我在采用NSSecureCoding方面遇到了麻烦.我编码一个包含我的自定义类的对象的数组,它NSSecureCoding正确采用.当我解码它,传递类NSArray(它是我编码的对象的类)时,它会抛出异常.但是,当使用字符串数组执行完全相同的操作时,它可以正常工作.我没看到我的类和NSString之间有什么区别.
#import <Foundation/Foundation.h>
@interface Foo : NSObject <NSSecureCoding>
@end
@implementation Foo
- (id)initWithCoder:(NSCoder *)aDecoder {
return [super init];
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
}
+ (BOOL)supportsSecureCoding {
return YES;
}
@end
int main() {
@autoreleasepool {
NSMutableData* data = [[NSMutableData alloc] init];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:@[[Foo new]] forKey:@"foo"];
[archiver encodeObject:@[@"bar"] forKey:@"bar"];
[archiver finishEncoding];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.requiresSecureCoding = YES;
// throws exception: 'value for key 'NS.objects' was …Run Code Online (Sandbox Code Playgroud) 尝试[self.extensionContext openURL:... completionHandler:...];在iOS 8 Share扩展程序中使用以打开包含应用程序永远不会打开应用程序,并始终使用success = NO调用完成处理程序.
以下是Action扩展的相同问题,但我认为Share扩展能够打开包含应用程序比Action扩展更合理.共享扩展的要点是上传一个可能很大的数据,并且在不打开应用程序的情况下执行此操作的唯一方法是通过NSURLSession,这只能执行HTTP(S)上载.但是应用程序可能希望通过与HTTP(S)上载不同的机制来共享内容.
Apple文档未声明openURL...不能用于任何特定类型的扩展.很难知道这是一个错误还是预期的行为.没有关于此的官方信息.
我正在使用iOS 10的CallKit接收来电.我的应用程序中的呼叫不是来自"电话号码"或"电子邮件地址",而是来自我的协议中的内部标识符.因此,我报来电与CXHandleType的CXHandleTypeGeneric(而不是CXHandleTypePhoneNumber或CXHandleTypeEmailAddress),使用自定义字符串作为手柄的"价值".
当我报告来电并且电话未锁定时,用户会看到来电屏幕,其中包含"提醒我","消息","拒绝"和"接受"按钮.如果用户按下"消息"按钮,并选择以下菜单中的一个消息字符串,它会尝试通过消息应用程序将该字符串作为文本消息发送,目标是我用作"值"的自定义字符串"电话的句柄,好像是电话号码或电子邮件地址,即使它不是.这通常会导致邮件由于目标无效而无法发送,但是,根据字符串,它实际上可能会发送到用户不想发送到的有效目标; 两种结果都很糟糕.
我正在寻找是否有办法让消息不通过消息应用程序发送(在我的情况下总是不正确),而是传递到我的应用程序,以便我可以通过我正确地将消息发送给调用者内部协议.
更新: iOS 10.1中不再显示"提醒我"和"消息"按钮
我们的 iOS 项目具有本地化的字符串,用于在 Xcode 中创建的“西班牙语”(es.lproj)和“西班牙语(拉丁美洲)”(es-419.lproj)。
但是,在 iPhone(美国,最新的 iOS 7)上,西班牙语的唯一语言选项是“Español”和“Español (México)”,没有“Latin America”。当您选择“Español (México)”时,它使用我们应用程序中的“Spanish”字符串,而不是人们所期望的“Spanish (Latin America)”字符串。
经进一步调查,[[NSBundle mainBundle] preferredLocalizations]返回@[@"es"]。即使[[NSBundle mainBundle] localizations]返回包含“es”和“es-419”的数组也是如此。
但是,[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]返回一个包含“es-MX”的数组。
然后是以下表达式:
[NSBundle preferredLocalizationsFromArray:@[@"es-419", @"es"]
forPreferences:@[@"es-MX"]]
Run Code Online (Sandbox Code Playgroud)
返回@[@"es"]。
为什么 Xcode 会给我们“西班牙语(拉丁美洲)”本地化,当您在手机上实际选择唯一的拉丁美洲西班牙语选项时不使用它?
在当前的iOS应用程序中,我使用此执行选择器方法:
[self performSelector:@selector(doSomething)
onThread:myThread
withObject:nil
waitUntilDone:NO
modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
Run Code Online (Sandbox Code Playgroud)
我不知道如何在swift中的特定线程上运行选择器.有什么建议?