0

我对 Objective-C 比较陌生,大约有 1 年的经验,并且在尝试向我的项目中添加类时遇到了问题。当我添加一个包含 XIB 文件的 UIViewController 子类时,我对此完全没有问题,xcode 以这种方式工作得很好。

但是,我尝试向名为 Test 的项目添加一个简单的 Objective-C 类,其中包含以下 .h 和 .m 文件,并且遇到了代码编译和构建没有错误但方法 TestMethod 始终返回 nil 的问题。这里可能有什么问题?

测试.h

#import <Foundation/Foundation.h>

@class Test;

@interface Test : NSObject {

}

- (NSString *)TestMethod;

@end

测试.m

#import "Test.h"

@implementation Test

- (NSString*)TestMethod {
    return @"Test";
}

@end

在我UIViewController的带有 XIB 文件的子类中,该子类可以正常工作,但是当我尝试在其中包含我的 Test 类时,TestMethod 方法什么也不返回,即使它被硬编码为始终返回相同的字符串:

#import "Test.h"

Test *testobject;

// this compiles and builds but returns nothing
NSString *testString = [testobject TestMethod];
4

5 回答 5

3

你错过了分配 + 初始化。

利用

Test *testobject=[[Test alloc] init];

或者

Test *testobject=[Test new];

每当您的对象未初始化时,您都会获得nil价值。

编辑:

ARC中:它是默认初始化的。

MRC中:该值可能未初始化(垃圾值)。

于 2013-05-26T04:54:10.353 回答
1

TestMethod 没有回归nil-testobject为零。

改变

Test *testobject;

Test *testobject = [[Test alloc] init];

于 2013-05-26T04:52:53.263 回答
1

您还没有创建 Test 的实例,所以 testObject 只是保持 nil。您需要将 Test 的实例分配给变量才能执行您想要的操作。

于 2013-05-26T04:54:11.023 回答
0

你也可以采取这种方法

//Test.h

#import <Foundation/Foundation.h>

@class Test;

@interface Test : NSObject {
}
- (id)init;
-(NSString*)TestMethod;

@end

现在在您的 Test.m 文件中

//测试.m

#import "Test.h"

@implementation Test


- (id)init {

     if (self=[super init]) {

     }
     return self;
}

-(NSString*)TestMethod {
return @"Test";
}

@end

现在如果你想在另一个类中调用这个测试类,你必须创建一个测试类的实例。

Test *testobject = [[Test alloc] init];

NSString *testString = [testobject TestMethod];
于 2013-05-26T06:30:43.347 回答
0

要访问类的任何方法/属性,首先需要使用 alloc/new 方法为该类的对象分配内存。

由于您创建了该类类型的变量<Test *testobject>。但是变量没有分配任何内存,默认情况下它将为零。使用“nil”,您可以调用目标 C 中的任何方法。它不会崩溃。但它会返回零。

因此,在访问任何对象之前,您必须为该对象创建内存

Test *testobject = [Test alloc];

使用默认构造函数(init、initWith 等)初始化对象

[testobject init];

现在对象已准备好调用实例方法/setter/getter 等...

NSString *testString = [testobject TestMethod];
于 2013-05-26T07:33:15.387 回答