我正在尝试学习目标 C,而我觉得很奇怪的一件事是什么时候使用 alloc 什么时候不使用。以这段代码为例:
NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];
为什么你不必先做这样的事情来分配它?
UIAlert *alert = [[UIAlertView alloc]]
我敢肯定,我缺少目标 C 中的一些基本内容,但奇怪的是,我很难在不发布的情况下找到解释。谢谢!!
我正在尝试学习目标 C,而我觉得很奇怪的一件事是什么时候使用 alloc 什么时候不使用。以这段代码为例:
NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];
为什么你不必先做这样的事情来分配它?
UIAlert *alert = [[UIAlertView alloc]]
我敢肯定,我缺少目标 C 中的一些基本内容,但奇怪的是,我很难在不发布的情况下找到解释。谢谢!!
问题+alloc
在于它保留了它的结果,这就是为什么它必须与调用-release
或-autorelease
稍后进行平衡的原因。为了避免每次使用类时都必须一遍又一遍地输入,API 设计人员通常会创建所谓的便捷构造函数或便捷方法。+URLWithString:
是其中之一,内部看起来像这样:
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
+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;
}
(实际上比这复杂一点,但在这里就足够了。)请注意,它+alloc
被定义为 的一部分NSObject
,而不是所有对象的一部分。+alloc
带有, -init
, -retain
,等的Cocoa 内存管理-release
并不总是 Objective-C 的一部分,并且可以创建不使用它的对象。
如果您知道正确的咒语,您实际上可以在不调用+alloc
的情况下创建类的实例。我不会推荐它。
使用 alloc 方法创建一个属于您的新对象。我的意思是像这样创建它
NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"]
,您成为该对象的所有者。在你使用它之后,让我们说
NSLog ("Url path is %@",url);
你必须释放这个对象(url)
[url release];
这是Objective C中关于内存管理的主要话题之一
你的说法呢,
NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];
我必须说系统会返回一个带有字符串的 url,但它不属于你,所以你不需要释放它,因为系统会自动释放它(自动向这个对象发送 autorelease 消息)