NSLog With NSString And Breaking Up main.m



在我运行这个程序之前,我有0个错误或警告。但是当我运行它时,我得到的输出是(lldb),XCode 突出显示我的 NSLog 输出并说Thread 1 Breakpoint 1?我的第一个问题是为什么我没有得到任何输出,我该如何解决我必须获得输出的问题?我的第二个问题是,我怎样才能把这些部分分解出来,把它们放到自己的类中。所以不要把它们都放在main.m上。这是我从Java用XCode编码的第一天,所以我仍在学习这种语言。谢谢。

第 1 部分

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    NSString * name;
    int age;
    int weight;
}
    /***************************************
     * MUTATORS FOR PERSON INTERFACE
     ***************************************/
    - (void) setName : (NSString *) n;
    - (void) setAge : (int) a;
    - (void) setWeight : (int) w;

    /***************************************
    * MUTATORS FOR PERSON INTERFACE
    ***************************************/
    -(NSString *) getName;
    -(int) getAge;
    - (int) getWeight;
@end

第 2 部分

@implementation Person
    /***************************************
     * MUTATORS FOR PERSON IMPLEMENTATION
     ***************************************/
    -(void) setName:(NSString *) n
    {
        name = n;
    }
    -(void) setAge:(int) a
    {
        age = a;
    }
    -(void) setWeight:(int)w
    {
        weight = w;
    }

    /**********************************
     * ACCESSORS FOR PERSON IMPLEMENTATION
     **********************************/
    -(NSString *) getName
    {
        return name;
    }
    -(int) getAge
    {
        return age;
    }
    -(int) getWeight
    {
        return weight;
    }
@end

第 3 部分 这就是我遇到问题的地方。它不喜欢NSLog

int main (int argc, const char * argv[])
{
    @autoreleasepool
    {
        Person *p1 = [[Person alloc]init];
        [p1 setName: @"Chris"];
        [p1 setAge:18];
        [p1 setWeight:200];
        NSLog(@"nName: %@ nAge: %i nWeight: %i", p1.getName, p1.getAge, p1.getWeight);
    }
    return 0;
}

使用 NSLog 时,%@ 用于记录对象,但这些方法返回 int(基元类型)。将它们替换为 %d(Decimal int 的字符串格式),该行应该停止崩溃。

要拆分它们,只需创建新的 .m 和 .h 文件。XCode应该能够帮助您完成此过程。.m文件将自动编译,.h文件应该(一般来说)包含在任何需要有关其引用的类的信息的文件中。因此,第 1 部分将是 Person.h,第 2 部分将是 Person.h(并包括行@import Person.h,第 3 部分将保留在 main.m 中。

如果你不介意我问,为什么不直接使用属性?它将使您的代码保持干净和简单,还可以为您节省大量键入时间。仅当需要实现属性无法提供的自定义行为时,才应实现访问器。

最新更新