我刚开始(过去几天读了很多).这是我堆积的一些问题,希望有人可以回答.
1.(self!= nil)检入初始化代码.为什么这样?为了防止意外访问包含在那里的一些"只运行一次"代码?从哪里来的意外访问来自?做这样的检查表明我无法控制正在发生的事情.
- (id)init {
self = [super init]
if (self != nil) {
// Code..
}
return self;
}
str = [[NSString alloc] initWithString:@"Hi there!"];
据我所知,你必须用第二种方法释放str,但不是先用?如果是这样,第一个什么时候发布?哪一个更好(不打算打字长度)?
4.什么是autorelease,如果iPhone没有垃圾收集?我注意到在main.m中创建了一个名为"自动释放池"的东西.是[myObject autorelease]; 一种将myObject添加到最近的包装"自动释放池"的方法,它将释放它?基本上,一些魔法,以避免自己释放它?为什么要用它?
好吧,现在就是这样.谢谢你的回答!
在Objective-C中,可以返回除self之外的实例-init
.例如,类执行此操作以强制执行单例实例,或者在类集群的情况下执行此操作.NSNumber
例如,根据传递给其初始值设定项的值的类型返回子类.所以,当你打电话[[NSNumber alloc] initWithLong:long_value]
,NSNumber
的-initWithLong:
初始值设定后称为NSNumber
S' +alloc
,但子类NSNumber
可以被返回给调用者oringial.因此模式
self = [super init];
它重新分配self
给值,[super init]
以便self
指向[super init]
返回的实际实例.如果+alloc
或者超级init
方法失败,结果[super init]
可能是nil
.为了避免在初始化失败的情况下产生副作用,模式就变成了
- (id) init { if(self = [super init]) { // do initialization of instance variables etc. } return self; }
请注意,您必须从方法返回self
(或nil
其他实例)init
.您应该指定自己,[super init]
并且可以nil
在做更多工作之前检查.
您可能必须释放staic方法的返回值.您应该阅读Cocoa内存管理指南.规则通常很简单:如果您调用的方法在其签名中具有"new","alloc"或"copy",则结果属于调用者,调用者必须调用-release
该实例或者存在内存泄漏.当然,您应该调用-retain
其他任何内容(即不是来自"alloc","new"或"copy"方法),您希望保留引用,然后调用-release
或-autorelease
完成该实例.
str = @"Hi there!"
,假设str
被声明为NSString *str;
赋值字符串的地址常量@"Hi there!" to the value of the
str variable. You do not need to retain or release string constants.
str = [[NSString alloc] initWithString:@"Hi there!"]; allocates a new string instance. The value of
str will be the address of this instance. Each call of
str = [[NSString alloc] initWithString:@"Hi there!"]; again will allocate a new instance. So after
str2 = [[NSString alloc] initWithString:@"Hi there!"]; ,
海峡!= str2的, while after
STR2 = @ "你好!", str==str2
.也请参阅此答案.
-autorelease
将接收器添加到当前NSAutoreleasPool
.当池耗尽时(通常在当前运行循环迭代结束时,或者手动耗尽池时),池将调用池中的-release
所有实例.如果-release
将保留计数降为0,则对象将被释放(并-dealloc
调用),就像其他任何对象一样-release
.在iPhone上使用自动释放池通常不赞成,因为它可能会导致您在运行循环迭代结束之前将池中的许多未使用实例累积掉.如果你可以使用-release
而不是-autorelease
,你通常应该.再次,请参阅Cocoa内存管理指南以获取更多信息.