当我玩Objective-C时,我刚刚制作了一个示例简短的演示程序:
一些代码:
// TestClass.h:
@interface TestClass : NSObject {
int someNumber;
float someFloat;
}
@property int someNumber;
@property float someFloat;
// Returns String containing some instance values:
-(NSString *)getNiceString;
// Returns always the same string:
-(NSString *)getAnotherString;
-(id)init;
@end
-
//TestClass.m:
#import "TestClass.h"
@implementation TestClass
@synthesize someFloat;
@synthesize someNumber;
-(NSString*) getNiceString{
return [NSString stringWithFormat:
@"Float number: %f and the number is: %d", self.someFloat, self.someNumber];
}
-(NSString *) getAnotherString{
return [NSString stringWithString:@"TEST STRING"];
}
-(id)init{
self = [super init];
if(self){
self.someFloat = 100.34;
self.someNumber = 324;
return self;
}
return nil;
}
@end
还有一些主要内容:
#import <Foundation/Foundation.h>
#import "TestClass.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
TestClass* instance = [TestClass alloc];
// Version 2:
// TestClass* instance = [[TestClass alloc]init];
NSLog(@"%@", [instance getNiceString]);
NSLog(@"%@", [instance getAnotherString]);
}
return 0;
}
当我在main中使用TestClass* instance = [TestClass alloc];
时,输出是:
2013-03-05 09:56:34.767 ObjectiveTest [8367:903]浮点数:0.000000 数量为:0 2013-03-05 09:56:34.770 ObjectiveTest [8367:903] 测试字符串
当使用第二个版本时(TestClass* instance = [[TestClass alloc]init];
):
2013-03-05 10:06:46.743 ObjectiveTest [8421:903]浮点数: 100.339996,编号为:324 2013-03-05 10:06:46.750 ObjectiveTest [8421:903] TEST STRING
问题是如果[TestClass alloc]
进行任何初始化操作(正确返回字符串且值为零)...值得一提的是,如果删除{{1}从TestClass.m实现具有-(id)init:
且没有它的版本的输出完全相同...是否有任何默认初始化?
答案 0 :(得分:2)
alloc会将内存区域清零。更多细节可以在What happens when alloc or allocWithZone is called?
找到答案 1 :(得分:1)
alloc
没有正确初始化对象,因此必须始终使用。
float没有正确初始化(0.000 != 100.34
),字符串是调用返回字符串文字的方法的结果,而不是实例变量。
答案 2 :(得分:1)
问题是,如果[TestClass alloc]进行任何初始化工作(String正确返回,值为零)...值得一提的是,如果我从TestClass.m中删除 - (id)init:实现,具有init和没有它的版本的输出完全相同...是否有任何默认初始化?
alloc不会初始化任何成员,所以如果你只调用alloc,那么someFloat将不会被初始化(默认值将为0.0)。如果从类实现中保留alloc方法,则会发生同样的情况:someFloat将不会被初始化,并且默认值为0.0。
但是调用alloc而不是init有许多缺点:所有子类初始化器都不会被调用,因此你将无法使用某些NSObject的属性,你不应该只调用alloc。 alloc-init总是按惯例使用。