我相对较新的Objective C,大约1年的经验,我遇到了尝试向我的项目添加类的问题。当我添加一个UIViewController子类,包含XIB文件时,我完全没有问题,xcode工作得非常好,但是,我尝试在项目中添加一个简单的Objective-C类,名为Test,下面的.h和.m文件,并且有一个问题,代码编译和构建没有错误,但方法TestMethod总是返回nil。我知道有一些简单的我在这里缺少我非常希望有人指出这里有什么问题。
Test.h
#import <Foundation/Foundation.h>
@class Test;
@interface Test : NSObject {
}
- (NSString *)TestMethod;
@end
Test.m
#import "Test.h"
@implementation Test
- (NSString*)TestMethod {
return @"Test";
}
@end
在带有XIB文件的UIViewController
子类中,该子类可以正常工作,但是当我尝试在其中包含我的Test类时,方法TestMethod什么都不返回,即使它被编码为总是返回相同的字符串:
#import "Test.h"
Test *testobject;
// this compiles and builds but returns nothing
NSString *testString = [testobject TestMethod];
非常感谢任何帮助。谢谢。
答案 0 :(得分:3)
你错过了分配+ init。
使用
Test *testobject=[[Test alloc] init];
或
Test *testobject=[Test new];
每当您的对象未初始化时,您将获得nil
值。
编辑:
在 ARC 中:默认初始化。
在 MRC 中:该值可能未初始化(垃圾值)。
答案 1 :(得分:1)
测试方法未返回nil
- testobject
为零。
更改
Test *testobject;
到
Test *testobject = [[Test alloc] init];
答案 2 :(得分:1)
您尚未创建Test实例,因此testObject只保留nil。您需要为变量分配一个Test实例才能完成您想要的操作。
答案 3 :(得分:0)
你也可以采用这种方法
//Test.h
#import <Foundation/Foundation.h>
@class Test;
@interface Test : NSObject {
}
- (id)init;
-(NSString*)TestMethod;
@end
现在在你的Test.m文件中
// Test.m
#import "Test.h"
@implementation Test
- (id)init {
if (self=[super init]) {
}
return self;
}
-(NSString*)TestMethod {
return @"Test";
}
@end
现在,如果要在另一个类中调用此Test Class,则必须创建一个Test Class实例。
Test *testobject = [[Test alloc] init];
NSString *testString = [testobject TestMethod];
答案 4 :(得分:0)
要访问类的任何方法/属性,首先需要使用alloc / new方法将内存分配给该类的对象。
因为您创建了该类类型<Test *testobject>
的变量。但是变量没有分配任何内存,默认情况下它将是nil。使用“nil”你可以调用目标C中的任何方法。它不会崩溃。但它将返回零。
因此,在访问任何对象之前,您必须为该对象创建内存
Test *testobject = [Test alloc];
使用默认构造函数(init,initWith等)初始化对象
[testobject init];
现在对象已准备好调用实例方法/ setter / getter等...
NSString *testString = [testobject TestMethod];