如何将参数(数组可变)传递给另一个类的函数?

时间:2014-08-16 15:15:44

标签: ios objective-c arrays

下面是一些代码

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现在工作:)现在我唯一的问题是如何让应用程序在后台运行谢谢!

4 个答案:

答案 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的丰富视频和文档库中研究该主题,否则您可能会收到低评和负面评论。