iphone iCloud应用程序在iOS 4上编译时崩溃

iphone iCloud应用程序在iOS 4上编译时崩溃,iphone,compiler-errors,icloud,Iphone,Compiler Errors,Icloud,我想使用iCloud,但当我在iOS 4.3模拟器上编译应用程序时,它崩溃了 dyld:未找到符号:_OBJC_CLASS_$\n NSMetadataQuery 我应该怎么做才能使它在iOS 3、4和5上工作?通常的方法是使用iOS 5 SDK编译它,并将部署目标设置为您希望它使用的最旧iOS版本。不过,您可以在运行时检查当前系统可用的类和方法。例如,iOS 4上的用户将无法使用仅随iOS 5提供的功能 要检查课程的可用性,请执行以下操作: if ( NSClassFromString(@"N

我想使用iCloud,但当我在iOS 4.3模拟器上编译应用程序时,它崩溃了

dyld:未找到符号:_OBJC_CLASS_$\n NSMetadataQuery


我应该怎么做才能使它在iOS 3、4和5上工作?

通常的方法是使用iOS 5 SDK编译它,并将部署目标设置为您希望它使用的最旧iOS版本。不过,您可以在运行时检查当前系统可用的类和方法。例如,iOS 4上的用户将无法使用仅随iOS 5提供的功能

要检查课程的可用性,请执行以下操作:

if ( NSClassFromString(@"NSMetadataQuery") != nil ) {
  //do stuff with NSMetadataQuery here
}
要检查方法的可用性,请执行以下操作:

if ( [myObject respondsToSelector:@selector(doSomething)] ) {
  //call doSomething on myObject
}

通常的方法是使用iOS5SDK编译它,并将部署目标设置为您希望使用的最旧iOS版本。不过,您可以在运行时检查当前系统可用的类和方法。例如,iOS 4上的用户将无法使用仅随iOS 5提供的功能

要检查课程的可用性,请执行以下操作:

if ( NSClassFromString(@"NSMetadataQuery") != nil ) {
  //do stuff with NSMetadataQuery here
}
要检查方法的可用性,请执行以下操作:

if ( [myObject respondsToSelector:@selector(doSomething)] ) {
  //call doSomething on myObject
}

这些API是与ios5一起启动的,因此您无法在模拟器4或更低版本上运行它,但对于发布,您可以设置它应该支持的ios系列的最低部署目标。

这些API是与ios5一起启动的,因此您无法在模拟器4或更低版本上运行它,但是对于发布,您可以设置ios系列的最低部署目标它应该支持的家庭。

我的建议是:

NSMetadataQuery在哪里更改为id:ex

正常:-voidloadData:NSMetadataQuery*查询; 更改为:-voidloadData:idquery

普通:@属性保留,非原子NSMetadataQuery*查询; 更改为:@property retain,非原子id查询

并检查iCloud是否可用:

if ([[NSFileManager defaultManager] respondsToSelector:@selector(URLForUbiquityContainerIdentifier:)]) {
        NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        if (ubiq) {
            // Code for access iCloud here
        }
    }
使用NSMetadataQuery时:

id _query = [[NSClassFromString(@"NSMetadataQuery") alloc] init];
// Some code here
[_query startQuery];
祝你玩得开心我的梦想是:

NSMetadataQuery在哪里更改为id:ex

正常:-voidloadData:NSMetadataQuery*查询; 更改为:-voidloadData:idquery

普通:@属性保留,非原子NSMetadataQuery*查询; 更改为:@property retain,非原子id查询

并检查iCloud是否可用:

if ([[NSFileManager defaultManager] respondsToSelector:@selector(URLForUbiquityContainerIdentifier:)]) {
        NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        if (ubiq) {
            // Code for access iCloud here
        }
    }
使用NSMetadataQuery时:

id _query = [[NSClassFromString(@"NSMetadataQuery") alloc] init];
// Some code here
[_query startQuery];


玩得开心^ ^

我使用了NSClassFromString,但那没有帮助。我也会犯同样的错误。除了iOS 4.3和iOS 5,我不会再为任何事情操心。有太多的东西是3中没有的。此外,在应用商店购买东西的人可能有更新过的手机。这篇文章有助于展示Instapaper这一流行应用的用户版本是如何崩溃的。短版本-除非您需要,否则不要只执行iOS5,但仅限iOS4和更高版本是可以的。我使用了NSClassFromString,但这没有帮助。我也会犯同样的错误。除了iOS 4.3和iOS 5,我不会再为任何事情操心。有太多的东西是3中没有的。此外,在应用商店购买东西的人可能有更新过的手机。这篇文章有助于展示Instapaper这一流行应用的用户版本是如何崩溃的。短版本-除非需要,否则不要只执行iOS5,但是只有iOS4和iOS 4以上版本是可以的。我将iOS部署目标设置为3.0。然后,它会出现问题,直到你不将其发布到应用商店。这是应用商店部署目标,而不是开发测试目标。因此,我无法在iOS 4设备上测试应用程序?不,你只能在iOS 5上开发应用程序,并将部署目标放在较低的操作系统上苹果有责任在应用商店上线后在这些设备上支持这个功能。我不同意巴鲁的观点。你可以安装iOS 4模拟器,然后在那里运行你的应用程序。如果它不运行,那是你的问题,而不是苹果。当您将最低IOS部署目标设置为“最新IOS”以外的任何内容时,您需要是一名经验丰富的开发人员,才能使其在较旧版本的IOS上运行。我已将IOS部署目标设置为3.0。然后,在您不将其发布到应用商店之前,它将产生问题。这是应用商店部署目标,而不是开发测试目标。因此,我无法在使用iOS 4的设备上测试应用程序?不,您只能在iOS 5上开发应用程序,并将部署目标放在较低的操作系统上。在应用商店上启动后,苹果有责任在这些设备上支持此功能。我不同意Ballu的观点。你可以安装iOS 4模拟器,然后在那里运行你的应用程序。如果它不运行,那是你的问题,而不是苹果。当您将最低IOS部署目标设置为除“最新IOS”之外的任何其他目标时,您需要是有经验的开发人员,才能使其在较旧版本的IOS上运行[[NSClassFromString@NSMetadataQueryalloc]init]。您不能使用[NSMetadataQuery alloc]。这里的重要部分是[[NSClassFromString@NSMetadataQueryalloc]init]。您不能使用[NSMetadataQuery alloc]。