gco*_*828 5 iphone objective-c alloc
我正在尝试学习目标C,其中一个我觉得非常奇怪的事情就是何时使用alloc以及何时不使用.以这段代码为例:
NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];
Run Code Online (Sandbox Code Playgroud)
为什么你不必先做这样的事情来先分配它?
UIAlert *alert = [[UIAlertView alloc]]
Run Code Online (Sandbox Code Playgroud)
我确信在目标C中我只缺少一些基本的东西,但奇怪的是我很难找到一个没有张贴的解释.谢谢!!
问题+alloc在于它保留了结果,这就是它必须与调用-release或-autorelease稍后调整的原因.为了避免每次使用类时都要反复输入,API设计人员通常会创建所谓的便利构造函数或便捷方法.+URLWithString:是其中之一,内部看起来像这样:
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
所以+alloc是为你而来,也是如此-autorelease.
Objective-C中有两种广泛的方法:类方法和实例方法.类方法本身发送给类,不需要创建该类的实例.实例方法被发送到实例并且可以访问实例占用的内存.类方法始于+; 实例方法-.
+alloc是一种类方法.它不是具有特定物体创造能力的神奇之物.内部的所有内容都是这样的:
+ (id)alloc {
id result = malloc(class_getInstanceSize(self));
if (result) {
memset(result, 0, class_getInstanceSize(self));
result->isa = self;
result->retainCount = 1;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
(它实际上比这复杂一点,但它应该足够了.)注意,它+alloc被定义为所有对象的一部分NSObject,而不是所有对象的一部分.可可内存管理,有+alloc,-init,-retain,-release,等并不总是Objective-C的一部分,和对象可以创建不使用它.
如果你知道正确的咒语,你实际上可以在不调用的+alloc情况下创建类的实例.我不推荐它.
| 归档时间: |
|
| 查看次数: |
3166 次 |
| 最近记录: |