对不起,如果问题不明确,这就是我想要做的事情。我有一个对象,一个委托和一个视图控制器。
对象伪代码
@interface Car: NSObject {
UIColor *color;
}
@property (assign)UIColor *color;
- (void) setColor(UIColor col);
@end
@implementation Car
@synthetize color;
// i know that synthesize makes this function redundant.
// I just used it to demonstrate
// the need to access an instance method.
- (void) setColor(UIColor col)
{
color = col;
}
@end
委托代码
@interface myDelegate: UIApplicationDelegate {
Car *car;
UIViewController *theView;
}
@property (assign)Car *car;
@end
@implementation myDelegate
@synthesize car;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
theView = [[MyViewController alloc]init];
return YES;
}
@end
查看伪代码
@interface MyViewController: UIViewController {
MyDelegate *appDelegate;
}
@property (retain) MyDelegate *appDelegate;
@end
@implementation MyViewController
@synthesize appDelegate;
- (void)viewDidLoad {
self.appDelegate = (MyDelegate*)[[UIApplication sharedApplication] delegate];
/// THIS IS MY ISSUSE!
[self.appDelegate.car setColor(UIColor);
}
@end
任何人都可以解释或指出我可以理解为什么[self.appDelegate.car setColor()]给我一个编译错误,上面写着“属性的未知组件setColor”。
我确信有一种方法可以在目标C中执行此操作,因为我会在python,java或其他OO语言中执行此操作。
非常感谢任何帮助
干杯 鲁迪
答案 0 :(得分:1)
您没有使用UIColor作为指针。
尝试使用UIColor *
而不只是UIColor
,编译器将停止抱怨
答案 1 :(得分:1)
首先,Car
类存在问题。 color
属性应定义为retain
,而不是assign
。 assign
通常用于非对象类型属性,例如NSInteger,BOOL,int等,以及由于它们创建保留周期而不应保留的特殊对象大小写。此外,- (void)setColor(UIColor col);
不是有效的方法名称,因为它被写为函数。在Objective-C中,每个参数前面都有冒号:
。
例如,采用以下方法:
- (void)setBodyColor:bodyColor lowerColor:lowerColor upperColor:upperColor;
虽然这在技术上是一种有效的方法签名,但通常以不同的方式编写,以使其使用更加清晰。如上所述,每个参数都是id
类型,它是通用对象类型。为了使事情更清楚,您将每个参数转换为它们所代表的对象类型:
- (void)setBodyColor:(UIColor *)bodyColor
lowerColor:(UIColor *)lowerColor
upperColor:(UIColor *)upperColor;
除了定义不正确之外,它也是多余的,因为定义名为color
的读写属性意味着将定义-setColor:
方法。代码如下所示:
@interface Car: NSObject {
UIColor *color;
}
@property (retain) UIColor *color;
@end
@implementation Car
@synthetize color;
- (void)dealloc {
[color release];
[super dealloc];
}
// If you need to override a method, that’s fine
- (void) setColor:(UIColor *)aColor
{
[aColor retain];
[color release];
color = aColor;
// do more stuff
}
@end
对你的代表来说,它也有问题。首先,myDelegate
被定义为UIApplicationDelegate
的子类,它甚至不是一个类:它是其他对象可以遵循的协议(或接口)。 car
属性也应定义为retain,因为它是您的app委托拥有的对象。在这里,theView
(可能会重命名为theViewController
)应该输入为MyViewController
,以使其更加清晰。
@interface MyDelegate : NSObject <UIApplicationDelegate> {
Car *car;
MyViewController *theView;
}
@property (retain) Car *car;
@end
@implementation MyDelegate
@synthesize car;
- (void)dealloc {
[car release];
[theView release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
theView = [[MyViewController alloc] init];
return YES;
}
@end
MyViewController
类存在的问题是appDelegate
被定义为retain
时可能是assign
。 app委托本身使用alloc / init创建视图控制器,这意味着app委托“拥有”视图控制器。视图控制器不应保留应用程序委托,因为这会创建保留周期(请参阅Retain Cycles)。
MyViewController.h
// forward declaration
@class MyDelegate;
@interface MyViewController: UIViewController {
MyDelegate *appDelegate; // non-retained
}
@property (assign) MyDelegate *appDelegate;
@end
MyViewController.m
#import "MyViewController.h"
#import "MyDelegate.h"
@implementation MyViewController
@synthesize appDelegate;
- (void)viewDidLoad {
self.appDelegate = (MyDelegate*)[[UIApplication sharedApplication] delegate];
[self.appDelegate.car setColor:[UIColor clearColor]];
/// THIS IS MY ISSUSE!
// [self.appDelegate.car setColor(UIColor);
}
@end