【问题标题】:Assigning instance variance in method leads to segfault在方法中分配实例方差会导致段错误
【发布时间】:2018-10-15 20:53:25
【问题描述】:

下面是相当基本的objective-c 代码。它包含一个实例变量i。问题是每当我尝试分配给它时,它几乎会在分配操作之后立即导致段错误。注意:它不会在分配点发生段错误。通常它在分配后出现段错误,我尝试调用一个方法。另外,请注意这不是您的标准 mac/apple Objective-c 代码。我正在使用 cygwin (Linux) 普通版的objective-c。所以我必须生成自己的allocdealloc 方法。

#import <objc/runtime.h>
#import <objc/Object.h>

@interface Test
{
    int i;
}

+(id)alloc;
- (id) init;
- (int) load;
@end

@implementation Test

+(id)alloc
{
    self = class_createInstance(self,0);
    return self;
}

-(id)init
{
    i = 0; // <------ if I comment out this line, there is no segfault
    return self;
}

-(int) load
{
    return i;
}

@end


int main(int argc, const char * argv[])
{
    Test * test = [[Test alloc] init];
    int v = [test load]; //segfaults here (NOTE: if I comment out this line, it does not segfault)
    return 0;
}

是什么导致了段错误?

【问题讨论】:

  • 不应该是 if (self = [super init]) { i = 0; } ?
  • +alloc 赋值给 self 后返回有点奇怪。那最初是类对象(大致是Class self),因此为它分配一个实例是“错误的”。不过,不知道这是否重要。
  • @onnoweb 这是一个根类。没有超类。

标签: objective-c segmentation-fault


【解决方案1】:

我希望,对于像您这样的根类,您需要显式声明 isa 实例变量。没有它,您的 i 将被解释为好像是 isa,这就是您崩溃的原因。

所以:

@interface Test
{
    Class isa;
    int i;
}

如果您不打算创建根类,您可能应该从Object 或类似的继承。

【讨论】:

  • 优秀!!我刚刚添加了isa 实例变量,我不再收到段错误错误(赞成票)。我是一名 C/C++ 程序员,因此几乎放弃了 Objective-C。很高兴我不必这样做。将进行更多测试,如果通过,我将标记为答案。
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 2022-01-18
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多