如何从其他方法属性执行代码

时间:2011-04-25 01:59:00

标签: iphone objective-c ios ios4

对不起,如果问题不明确,这就是我想要做的事情。我有一个对象,一个委托和一个视图控制器。

对象伪代码

@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语言中执行此操作。

非常感谢任何帮助

干杯 鲁迪

2 个答案:

答案 0 :(得分:1)

您没有使用UIColor作为指针。

尝试使用UIColor *而不只是UIColor,编译器将停止抱怨

答案 1 :(得分:1)

首先,Car类存在问题。 color属性应定义为retain,而不是assignassign通常用于非对象类型属性,例如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