下面是一些代码
PrjClass.m //this is my class with interface NSObject
//my function
-(void) printArrayToNSLog:(NSMutableArray*)arr{
for (int x=0;x<[arr count];x++)
NSLog(@"Index %d = %@",x,[arr objectAtIndex:x]);
}
PrjClass.h //with NSObject
//function declaration
-(void)printArrayToNSLog:(NSMutableArray*)arr;
PrjMain.h //with UIViewController
//i importer the class
#import "PrjClass.h"
@interface PrjMain : UIViewController{
PrjClass *function;
}
PrjMain.m //UIviewController
//declaration of array(s)
NSMutableArray *myArray;
myArray =[[NSMutable arrayWithObjects:@"String",@"String2",@"String3",nil];
[function printArrayToNSLog:myArray];//[thisisthevariableclassname funtionname:argument];
@end
代码中没有错误和警告。还尝试在代码中放置断点,它转到函数调用但不转移到PrjClass.h
或.m
使用xcode 4.6.3(不确定,但在虚拟框中使用Mac Mountan lion)
来扼杀它如何从类中调用函数?
更新!! 非常感谢你 !! IT现在工作:)现在我唯一的问题是如何让应用程序在后台运行谢谢!
答案 0 :(得分:0)
问题是您永远不会创建PrjClass
的实例,因此function
仍然是nil
并尝试在nil
上调用实例方法对象,什么都不做。
您希望确保首先实例化function
:
function = [[PrjClass alloc] init];
NSMutableArray *myArray = [[NSMutableArray arrayWithObjects:@"String",@"String2",@"String3",nil];
[function printArrayToNSLog:myArray];
或者,您也可以将其设为类方法(在+
方法声明之前放置printArrayToNSLog
,而不是-
):
+ (void) printArrayToNSLog:(NSArray*)arr
{
for (int x = 0; x < [arr count]; x++)
NSLog(@"Index %d = %@",x,[arr objectAtIndex:x]);
}
然后您可以在没有PrjClass
实例的情况下调用该方法。因此,您可以完全取消function
,只需拨打[PrjClass printArrayToNSLog:...]
:
NSMutableArray *myArray = [[NSMutableArray arrayWithObjects:@"String",@"String2",@"String3",nil];
[PrjClass printArrayToNSLog:myArray];
答案 1 :(得分:0)
你像这样分配init类prjClass对象。
PrjMain.m // UIviewController
//declaration of array(s)
NSMutableArray *myArray;
myArray =[[NSMutable arrayWithObjects:@"String",@"String2",@"String3",nil];
function = [[function alloc]init];
[function printArrayToNSLog:myArray];//[thisisthevariableclassname funtionname:argument];
@end
答案 2 :(得分:0)
除了@Rob所说的内容如果你的功能是静态的:
+(void) printArrayToNSLog:(NSMutableArray*)arr{
for (int x=0;x<[arr count];x++)
NSLog(@"Index %d = %@",x,[arr objectAtIndex:x]);
}
和
+(void) printArrayToNSLog:(NSMutableArray*)arr
您可以在不创建该类实例的情况下调用它
[PrjClass printArrayToNSLog:myArray];
答案 3 :(得分:0)
您使用完全不同的问题更新了您的问题:
现在我唯一的问题是如何让应用程序在后台运行
这完全取决于你的意思:
您是否希望在应用继续执行其他操作时运行一些耗时的任务?
在这种情况下,您将使用操作队列(NSOperationQueue
)或调度队列(a.k.a.Grand Central Dispatch,GCD)。请参阅Concurrency Programming Guide并观看GCD上的一些WWDC视频,并发性,异步编程模式等。在您对该主题进行一些研究之前,请不要就此主题发表问题。
即使用户已离开您的应用并转到其他地方,您是否只想花一点时间完成一项耗时的任务?
在这种情况下,请参阅 iOS应用程序编程指南的App States and Multitasking章节中的在后台执行有限长度任务部分。这将向您展示如何使用beginBackgroundTaskWithExpirationHandler
启动一个耗时的过程,即使用户离开您的应用也会继续。
您是否希望在应用终止后继续运行网络请求?
在这种情况下,您将继续使用NSURLSession
,特别是后台会话。
您是否希望您的应用在后台定期检查网络更新。
在这种情况下,iOS 7提供了一些方法,如What's new in iOS: iOS 7:
中所述iOS 7支持两种新的应用后台执行模式:
通过联系服务器定期更新其内容的应用程序可以向系统注册,并定期启动以在后台检索该内容。要注册,请在应用的Info.plist文件中包含带有获取值的
UIBackgroundModes
密钥。然后,当您的应用启动时,请调用setMinimumBackgroundFetchInterval:
方法以确定它接收更新消息的频率。最后,您还必须在应用代理中实施application:performFetchWithCompletionHandler:
方法。使用推送通知向用户通知新内容可用的应用可以在后台获取内容。要支持此模式,请在应用的Info.plist文件中包含带有远程通知值的
UIBackgroundModes
键。您还必须在应用代理中实施application:didReceiveRemoteNotification:fetchCompletionHandler:
方法。
您是否希望通常让您的应用在后台运行?
这不是Apple支持的模式,除非是非常特殊的情况(VOIP,音乐播放器,导航应用程序等)。这是因为它是一个巨大的性能/电池杀手,所以他们确保你只是出于当之无愧的原因。同样,我会向您推荐App States and Multitasking以获取更多信息。
最重要的是,这个无害的“如何使应用程序在后台运行”的问题很复杂,你需要更好地澄清你正在尝试做什么,因为不同的问题需要不同的方法。在发布问题之前,请确保在发布有关该主题的问题之前在Apple的丰富视频和文档库中研究该主题,否则您可能会收到低评和负面评论。