从其他类Objective-C访问方法

Posted

技术标签:

【中文标题】从其他类Objective-C访问方法【英文标题】:Accessing Method from other Classes Objective-C 【发布时间】:2010-12-12 02:53:36 【问题描述】:

正在寻找这个问题的答案,但我还没有找到合适的答案。我希望你们(和女孩)可以帮助我! (这是针对 iPhone 应用的)

好的,我有一个 Mutliview 应用程序。每个视图都有自己的类,一切都很愉快。但是,不同的类有时会调用相同的方法。到目前为止,我只是在两个类文件中编写了两次该方法。

这就是我想要做的:

我想在它自己的文件中创建一个新类,它包含所有“通用”方法。然后,每当另一个类需要调用该方法时,我只需从另一个文件中调用它。这样,当我想更改 Method 时,我只需要更改一个地方,而不是所有地方...

我不知道该怎么做,这就是我寻求帮助的原因。我对 Objective-C 有点生疏和新手,所以漂亮的例子会对我有很大帮助。请允许我给你一个。

文件:ViewController1.m

@implementation ViewController1

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

文件:ViewController2.m

@implementation ViewController2

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

文件:CommonClass

@implementation commonClass

- (void)CommonMethod:(id)sender


//So some awesome generic stuff...



    
@end

我觉得我需要#import 另一个文件,从类中创建一个对象并从对象中调用方法...我该怎么做?

再次感谢!

【问题讨论】:

【参考方案1】:

在分配和初始化视图时传入对 commonClass 的引用...

CommonClass *cc = [[CommonClass alloc] init];

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc];
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc];

但是制作一个经典的 c 包含可能就足够了。

【讨论】:

【参考方案2】:

您可以使用的另一种方法

@interface ServerManager : NSObject

+(ServerManager *)getInstance;

@implementation ServerManager

+(ServerManager *)getInstance

static ServerManager *objServerManager = nil;

if(objServerManager==NULL)
objServerManager=[[self alloc] init];

// Return the servermanager object.
return objServerManager;

调用是否要使用

ServerManager *SMObject =   [ServerManager getInstance];

别忘了导入 servermanager.h 文件。

【讨论】:

【参考方案3】:

作为具有 Java 背景和小 C 的 iPhone 新手,我遇到了类似的问题,希望同时引用 RootController 和 ViewController 中的方法。在我看来,该方法的正确位置是 AppDelegate 类,一个实例可以通过以下方式在其他类中获得:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

然后,如果方法是“doSomething”,则可以通过以下方式访问它:

[delegate doSomething];

但也许这太明显了,或者不是所需要的。

【讨论】:

【参考方案4】:

这里有一些答案告诉您创建一个通用的“父”类。但是我认为你可以做得更好。而是为 UIViewController 创建一个category。您不了解 UIViewController 发生的所有内部情况,因此我认为不值得创建自己的 View Controller 层次结构。事实上,这可能很危险。当我尝试创建一个“基础”UITableViewController 然后创建继承自它的类时,我遇到了许多问题。我通过使用类别来避免这些问题。

您的第一要务不应该是无缘无故地继承东西,而应该是让人们想要下载的应用进入应用商店。

【讨论】:

【参考方案5】:

选项 1:

@implementation commonClass
+ (void)CommonMethod:(id)sender  /* note the + sign */

//So some awesome generic stuff...
    
@end

@implementation ViewController2

- (void)do_something... 
    [commonClass CommonMethod];



@end

选项 2:

@implementation commonClass
- (void)CommonMethod:(id)sender

//So some awesome generic stuff...
    
@end

@implementation ViewController2

- (void)do_something... 
    commonClass *c=[[commonClass alloc] init];
    [c CommonMethod];
    [c release];


@end

选项 3:使用继承(参见 Totland 先生在此线程中的描述)

@implementation commonClass
- (void)CommonMethod:(id)sender

//So some awesome generic stuff...
    
@end

/* in your .h file */
@interface ViewController2: commonClass

@end

当然你总是需要在你的视图控制器中#import commonClass.h..

【讨论】:

你好,这里的commonClass的超类是什么?我的意思是我有一种方法需要从许多不同的类中调用,那么最好的做法是什么? 在 ARC 模式下是否允许使用 [property release]?编译器告诉我这是不允许的。 @tymac 这篇文章来自 2009 年,在 ARC 之前。【参考方案6】:

你要做的是让两个控制器共享一个共同的超类:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2

commonMethod: 然后将驻留在 MyAwesomeViewController 中。另外,不要以大写字母开头的方法名称。 :)

详细说明:

+@interface MyAwesomeController : UIViewController 

-@interface ViewController1 : UIViewController  // and ditto for ViewController2
+@interface ViewController1 : MyAwesomeController 

【讨论】:

【参考方案7】:

请记住,Objective-C 只是 C 的超集,虽然 #include 指令主要用于头文件,但没有什么能阻止您使用 #include 将一个实现的内容嵌入另一个实现中。如果代码确实相同,您可以轻松地将其粘贴到自己的文件中,然后将其#include 到 .m 文件中。

话虽如此,也许将这种技术与类别结合使用会更好,特别是如果相同的实现具有相似的行为。

【讨论】:

【参考方案8】:

在我看来,公共代码根本不需要在一个类中。您是否有理由不能只使用 C 风格的函数来做您想做的事情?

您可以将公共代码放在一个类中,然后将其他两个类作为该类的子类;这种方法也避免了代码重复。

另一种选择可能是为此公共代码编写类方法而不是实例方法。我认为大多数人都认为最好避免将单例作为设计选择。

如果我们对您真正想要完成的工作有更多了解,那么给出一个好的答案会更容易。

【讨论】:

这似乎是没有利用继承的问题。 谢谢。我在 Class1 中有一个方法(method1)。我在 Class1.h 中声明它并在 Class1.m 中实现。我有 Class2,它有一个选择器:@selector(method1)。在这种情况下,我该怎么做? @Williham,听起来就是这样。 @srikanth,也许你需要问一个问题而不是在这里发表评论?

以上是关于从其他类Objective-C访问方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中使用访问器方法进行指针工作

Objective-C 处理动态类型的方法

Objective-C - 从不同的类访问属性[重复]

项目在 Swift 中时无法从 Objective-C 访问 swift 类

如何从 Swift 扩展访问 Objective-C 类的私有成员?

module.map 用于从测试目标访问主目标中的(Swift 和 Objective-C)类