Прежде всего, у класса 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, поскольку это объект, которым владеет ваш делегат приложения. Здесь 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
. Сам делегат приложения создает контроллер представления с использованием alloc / init, то есть делегат приложения «владеет» контроллером представления. Контроллер представления не должен сохранять делегат приложения, потому что это создаст цикл сохранения (см. 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