类别是否允许在访问链式方法时使用点语法?

时间:2011-08-08 13:21:02

标签: iphone objective-c autocomplete xcode4 categories

我需要将一个方法附加到我的所有UIViewControllers。该方法只返回指向我的主应用程序委托类对象的指针。但是,xcode 4在输出参数类型MyAppDelegate的声明中在头文件中抛出错误“解析问题预期类型”。如果我将其更改为其他类型,例如id,则错误消失。但我使用点语法来访问主应用程序委托属性,如果我将类型更改为id,则xcode4无法识别我的主应用程序委托属性。我已经将类别的定义文件包含在我正在访问此方法的UIViewController类文件中。以下是我的类别的定义:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "MyAppDelegate.h"

@interface UIViewController (MyCategory)

-(MyAppDelegate *) appDelegate; // xcode 4 complains about MyAppDelegate type, though it autocompletes it and show even in green color.

@end

这是一个实现:

#import "MyCategory.h"

@implementation UIViewController (MyCategory) 

-(MyAppDelegate *)appDelegate{
  MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
  return delegate;
}

编辑:我实现这个类别的原因是我需要有一个方便的快捷方式从代码的任何地方访问我的主应用程序代理(在我的例子中来自UIViewControler对象):

// handy shortcut :)
self.appDelegate.someMethod;

//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

3 个答案:

答案 0 :(得分:1)

-(id)appDelegate{
  return [[UIApplication sharedApplication] delegate]; 
} 

//Calling code
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate];

答案 1 :(得分:1)

我认为你的头文件中有一个依赖循环。如果MyAppDelegate.h直接或间接导入MyCategory.h,则第一次编译类别声明时,编译器将不知道MyAppDelegate是什么。您应该从MyAppDelegate.h标头中删除MyCategory.h的导入,并将其替换为正向类声明:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class MyAppDelegate

@interface UIViewController (MyCategory)

-(MyAppDelegate *) appDelegate; 

@end

然后将导入放在.m文件中。这实际上是一个很好的一般原则。在可能的情况下,在标头中使用前向类声明并将导入放在实现文件中。

答案 2 :(得分:0)

@class MyAppDelegate;添加到类别标题的顶部,让编译器知道此类存在或#import其标题。

通常,在MyAppDelegate中使用类方法执行相同操作可能更好。从概念上讲,appDelegate不是您的方法所暗示的单个视图控制器的属性。