【问题标题】:Simple ObjC program falling to freeze简单的 ObjC 程序冻结
【发布时间】:2015-10-20 04:04:25
【问题描述】:

为什么 ObjC 程序会卡住? 我是 ObjC 的新手,正在尝试通过命令在 Linux 系统上编译它:

gcc $(gnustep-config --objc-flags) *.m $(gnustep-config --base-libs)

代码如下:

int main (int argc, const char * argv[])
{
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        Rect * r = [[Rect alloc]initWithWidth:30 height:50];
        NSLog(@"%f", [r height]);

        [pool drain];
        return 0;
}

//=====
#import <Foundation/Foundation.h>

@interface Rect : NSObject <NSCopying> {
}

@property double width;
@property double height;

- (Rect *) initWithWidth:(double)w
                  height:(double)h;
- (double) height;
//...

//=====
@implementation Rect
- (Rect *) initWithWidth:(double)w
                  height:(double)h
{
    self.width = w;
    self.height = h;
    return [super init];
}

- (double) height
{
    return self.height;
}
// ...

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    当您调用return self.height; 时,您正在创建一个无限递归循环,将该行更改为return _height;,它应该可以工作。您还可以从头文件中删除 - (double) height;,因为您的属性声明会自动生成一个 setter - (void)setHeight:(double)height; 和一个 getter - (double)height;。您还应该从您的实现中删除 getter,因为它已经通过属性声明生成。

    【讨论】:

    • 谢谢。我删除了 setterd 和 getter 并得到了这样的错误:rectangle.m:29:1: 警告:类 'Rect' 的不完整实现 rectangle.m:29:1: 警告:'-setWidth:' 的方法定义未找到rectangle.m:29:1:警告:找不到“-width”的方法定义 rectangle.m:29:1:警告:找不到“-setHeight:”的方法定义 rectangle.m:29:1:警告:方法找不到“-height”的定义
    • 由于你使用的是 gcc 我不确定它是否支持自动访问器合成。您是否尝试在实施开始时添加@synthesize height, width;?但是,您可以使用 clang 进行编译。
    • 程序编译运行正常吗?
    • @PeterSegerblom 没有。我添加了@synthesize 指令(就在@implementation 的下方),删除了所有setter 和getter,并且无论如何都收到了关于不完整类声明的错误。此外,由于我的发行版存在这个错误:link,我还没有将 clang 与其他语言一起使用。我会尝试解决这个问题,并会发送更多信息。谢谢你们的帮助,伙计们!
    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多