可可属性与合成

时间:2011-08-02 00:16:39

标签: objective-c cocoa

我正在努力学习Cocoa,并希望开发一个我年轻时玩过的非常简单的游戏。它最初是在MS Basic中创建的。请注意我对Cocoa和目标c很新。

我创建了一个名为Defaults的对象。它存储了三个整数变量,行星,战士和玩家。

在前端,我有三个带有各种默认值的下拉框。

我想了解KVC以及如何设置值,但我收到以下警告......

“与'int *'

类型的参数发送'int'的指针不兼容的整数

[新代码]

DEFAULTS.H

#进口    #import

@interface Defaults : NSObject {

int fighters;
int planets;
int players;

}

@property (assign) int fighters;
@property (assign) int planets;
@property (assign) int players;

@end

以下是我控制器中实现的摘录:

#import "DefaultsController.h"
#import "Defaults.h"

@implementation DefaultsController

- (id)init
{
self = [super init];
if (self) {
    // Initialization code here
 Defaults *theDefaults = [[Defaults alloc] init];
    NSLog(@"Planets: %@",[theDefaults valueForKey:(@"planets")]);
}
return self;

}

-(void)dealloc
{ 
[super dealloc];
[Defaults release]; 
}

-(void) awakeFromNib{

}

-(IBAction) addPlanets:(id)sender{

[theDefaults setValue:[planetsButton titleOfSelectedItem] forKey:@"planets"];
[theDefaults setPlanets:[[planetsButton titleOfSelectedItem] intValue]];
theDefaults.planets = [[planetsButton titleOfSelectedItem] intValue];
NSLog(@"Planets: %i", theDefaults.planets);
NSLog(@"%@", [planetsButton titleOfSelectedItem]);
NSLog(@"%i", [[planetsButton titleOfSelectedItem] intValue]);

}

我做错了什么?

1 个答案:

答案 0 :(得分:5)

您已将属性声明为整数指针,但之后您尝试将它们设置为整数值,而不是整数指针值。删除“int * fighters”等中的星号,将它们更改为整数。

指针是基于C语言(包括Objective-C)的最基本和最具挑战性的概念之一,如果你不清楚我在上面提到的区别,我建议你仔细解释它们是如何工作的

<强>更新

我在这里看到的另一个问题,可能与你的问题有关,就是你在日志记录中做了一些有趣的事情。当您将%@放入格式化字符串时,您告诉NSLog您希望它用Objective-C 对象替换它。但是int不是一个对象;它只是一个基本的C类型。然后,您使用键值编码来检索属性值,这进一步使问题混乱,因为键值编码也适用于Objective-C对象。用以下内容替换该行:

NSLog(@"Planets: %i", theDefaults.planets);

我认为你会得到更符合你期望的东西。 %i告诉NSLog你有一个要打印的整数值,theDefaults.planets(或等价的[theDefaults planets])将返回行星属性的值,无论它是否是一个对象。