难以理解Alloc和init

时间:2015-04-22 22:53:44

标签: objective-c

我正在学习alloc和init,但我不明白它应该是什么意思。他们给出了

的例子
NSString *emptyString = [[NSString alloc] init];
NSArray *emptyArray = [[NSArray alloc] init];
NSDictionary *emptyDictionary = [[NSDictionary alloc] init];

我不知道它甚至会被用于什么。

接下来我必须使用stringWithString并执行此操作。没有任何线索在这里发生。有人可以帮助我,但可以理解/轻松解释它。谢谢

NSString *firstName = @"Daniel";
NSString *copy = [[NSString alloc] stringWithString:firstName];
NSLog(@"%@ is a copy of %@", copy, firstName);

2 个答案:

答案 0 :(得分:1)

第一点:

如果您熟悉C ++代码,那么在创建对象时,基本上您可以按如下方式创建该类的新实例:

ClassA object1= new ClassA();

new只是目标-C中的alloc+init

ClassA *object1 = [[ClassA alloc] init];

第二点:

[NSString stringWithString:@"some string"]

相当于

[[NSString alloc] initWithString:@"some string"]

以下是更多信息:

alloc :NSObject的类方法。返回接收类的新实例。

init :NSObject的实例方法。由子类实现,在分配了内存之后立即初始化一个新对象(接收者)。

new :NSObject的类方法。分配接收类的新实例,向其发送init消息,并返回初始化对象。

发布:NSObject委托的实例方法。减少接收者的参考计数。

autorelease :NSObject委托的实例方法。将接收器添加到当前自动释放池。

保留:NSObject委托的实例方法。增加接收者的引用计数。

copy :NSObject委托的实例方法。返回一个新实例,它是接收者的副本。

总而言之,我们可以说

alloc 与init

一起使用

= alloc + init

可以找到更多信息https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html

答案 1 :(得分:1)

  1. 创建空数组和字典有点奇怪;通常你只能使用他们的可变版本。我想空字符串可以用于与其他字符串对象进行比较,但即便如此,使用@""似乎更容易阅读。

    alloc是一个类方法,为适当类的对象分配空间。 init是一个实例方法,它初始化该新实例,以便它可以作为该类的对象正确运行。

  2. stringWithString的使用不正确;你不应该在alloc使用它。类似的东西:

    NSString *copy = [firstName copy];
    

    会更合适。