为什么没有设置此Objective C代码中的对象?

时间:2014-02-12 08:43:14

标签: objective-c

我有下面的代码,只需读取一堆卡片,如果事先不存在,就将其名称输入Mutable Array。

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSMutableArray *allCards = [[NSMutableArray alloc] init];
        char cardAvailable = '\0';
        do {
            Card *newCard = [[Card alloc] init];
            NSLog(@"What is the Card Name ?\n");
            char cName[20];
            scanf("%s",cName);
            NSString *nName = [NSString stringWithCString:cName encoding:1];
            [newCard setName:nName];
            if([newCard wasMatch:allCards]) {
                NSLog(@"Card Already Present");
            } else {
                NSLog(@" NEW CARD NAME %@ %@ %s",[newCard getName],newCard.name, cName);
                [newCard addGlobal:newCard toArray:allCards];
            }
            NSLog(@"Is there another Card to Input?");
            scanf("%c",&cardAvailable);
        } while(cardAvailable != 'N' || cardAvailable != 'n');

        NSLog(@":::: Card Names Are ::::");
        for(Card *card in allCards)
        {
            NSLog(@"%@",card.name);
        }
    }
    return 0;
}

然而,首先 - 这个名字根本就没有设定。我不知道为什么会这样。今天是Objective C的第一天,所以请原谅我,如果这太简单了。

卡类文件是 -

#import <Foundation/Foundation.h>

@interface Card : NSObject

    @property(nonatomic) BOOL chosen;
    @property (nonatomic, getter = getName) NSString *name;

    -(BOOL)wasMatch:(NSMutableArray*) allCards;
    -(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards;
    -(void)setName:(NSString *)name;
    -(void)setChosen:(BOOL)chosen;
@end

我在这里得到错误 - 在添加全局行中。

#import "Card.h"

@implementation Card

@synthesize chosen = _chosen;

-(BOOL)chosen
{
    return _chosen;
}

-(void)setChosen:(BOOL)chosen
{
    _chosen = chosen;
}

@synthesize name = _name;

-(NSString*)getName
{
    return _name;
}

-(void)setName:(NSString*)name
{
    name = _name;
}

-(BOOL)wasMatch:(NSMutableArray *)allCards
{
    for(Card *card in allCards)
    {
        if([self.name isEqualToString:card.name])
        {
            return true;
        }
    }
    return false;
}

-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards
{   NSLog(@" THE NS STRING %@",aCardName.name);
    [allCards addObject:aCardName.name];
}

@end

3 个答案:

答案 0 :(得分:1)

你的二传手是错的。

-(void)setName:(NSString*)name
{
    name = _name;
}

将当前实例变量(_name)分配给参数。

这应该是另一种方式。

-(void)setName:(NSString*)name
{
    _name = name;
}

但你根本不需要这个。您的代码存在各种问题。

  • Objective-C不对普通的getter使用getFoo @property (nonatomic, getter = getName) NSString *name;应该是 @property (copy, nonatomic) NSString *name;

除非你在古老版本的Objective-C中编写代码(你不应该这样做),否则你不需要显式的getter和setter。在最近的版本中,您甚至不必明确合成 在较新版本的Objective-C中,您的Card类看起来应该更像这样:

@interface Card : NSObject

@property (assign, nonatomic) BOOL chosen;
@property (copy, nonatomic) NSString *name;

-(BOOL)wasMatch:(NSMutableArray*) allCards;
-(void)addGlobal:(Card*) aCardName toArray:(NSMutableArray*) allCards;
@end

#import "Card.h"

@implementation Card

-(BOOL)wasMatch:(NSMutableArray *)allCards
{
    for(Card *card in allCards)
    {
        if([self.name isEqualToString:card.name])
        {
            return YES;
        }
    }
    return NO;
}

-(void)addGlobal:(Card *)aCardName toArray:(NSMutableArray *)allCards
{   NSLog(@" THE NS STRING %@",aCardName.name);
    [allCards addObject:aCardName.name];
}

@end

方式更少的代码。您可能希望寻找更新的学习资源。

其余代码看起来也有问题。老实说,我没有在addGlobal:toArray:中看到这一点。但我不想让这个答案超过必要的时间。 ; - )


另外,为了爱你未来的自我,不要在NSString *nName = [NSString stringWithCString:cName encoding:1];中使用1来使用常数。在您的情况下NSASCIIStringEncoding。但是因为它不再是1980年,你很可能想要使用NSUTF8StringEncoding而不是ASCII。

正如我所说,请获取更多近期和体面的学习资源。

答案 1 :(得分:0)

-setName:属性访问器方法中,将_name实例变量值分配给name参数。它应该像这样交换:

-(void)setName:(NSString*)name
{
    _name = name;
}

答案 2 :(得分:0)

要学习Objective-C,我将重新评论Paul Hegarty最近的斯坦福大学讲座。 CS193p该类被调用。你可以在iTunes U上找到所有材料和优秀视频。除了Apple资源之外,没有比这更好的了。