新手Objective C错误,例如_main

Posted

技术标签:

【中文标题】新手Objective C错误,例如_main【英文标题】:Newbie Objective C Error such as _main 【发布时间】:2015-08-12 20:17:54 【问题描述】:

我整天都在修修补补,我似乎无法修复这个错误。

代码如下:

//
//  main.m
//  Learning ObjC
//
//  Created by Nickirv on 8/9/15.
//  Copyright (c) 2015 Nickirv. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person: NSObject
    int age;
    int weight;

-(void) print;
-(void) setAge: (int) a;
-(void) SetWeight: (int) w;
@end

它会输出这个问题:

 "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果有任何帮助,我将不胜感激!非常感谢你!

【问题讨论】:

前导下划线 _ 由编译器添加到函数名称之前,因此您看到的 main 在编译器和错误消息中变为 _main 【参考方案1】:

您不能删除main 样板代码:

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

    
    return 0;

最后,Objective-C 是“C”,程序通过调用main 开始执行。此外,Objective-C 代码需要在 autoreleasepool 中执行。

您在样板之外(通常在上面)定义类 @interfaces@implemtations,但要运行的第一行代码必须在自动释放池范围内

这是一个示例 Objective-C 程序,类似于 OP 似乎想要的,为了简单和演示,使用 @properties

在完全理解以下代码之前,学习 Objective-C 文档很重要,td;dr 不适用于此。

#import <Foundation/Foundation.h>

@interface Person: NSObject
@property int age;
@property int weight;
- (void)print;
@end

@implementation Person : NSObject
- (void)print 
    printf("Age: %i, weight: %i", self.age, self.weight);

@end


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

        Person *don = [[Person alloc] init];
        don.weight = 130;
        don.age = 23;
        [don print];

    
    return 0;

输出:

年龄:23​​,体重:130

【讨论】:

感谢您的帮助!主要样板代码是否高于我的@implementation 和@interfaces 是否重要? 是的,因为main 函数必须知道它调用了什么。一般来说,在 Objective-C 类中,当前编译器中不需要事先声明(方法顺序)。区别是编译器中的一种怪癖。一般来说,Objective-C 代码在一个单独的文件中,所以这个排序问题不是问题。 非常感谢您的真诚帮助!

以上是关于新手Objective C错误,例如_main的主要内容,如果未能解决你的问题,请参考以下文章

Objective C UITableView - 更改单元格高度后表格单元格显示错误内容

Objective C 新手

Objective C 使用字符串调用方法

当我们在iOS应用程序中使用Objective C输入错误的安全代码时如何显示警报

Objective C,核心数据获取请求

Objective-c 头文件中的 C++ 类声明