首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标C何时使用alloc,何时不使用alloc

目标C何时使用alloc,何时不使用alloc
EN

Stack Overflow用户
提问于 2011-11-06 22:01:07
回答 2查看 3.4K关注 0票数 5

我正在尝试学习objective C,我发现其中一件非常奇怪的事情是什么时候使用alloc,什么时候不使用。以下面这段代码为例:

代码语言:javascript
复制
NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

为什么你不先做这样的事情来分配它呢?

代码语言:javascript
复制
UIAlert *alert = [[UIAlertView alloc]]

我确信我在objective C中遗漏了一些基本的东西,但奇怪的是,我很难在不发帖的情况下找到一个解释。谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-06 22:13:00

+alloc的问题是它保留了它的结果,这就是为什么它必须与稍后对-release-autorelease的调用相平衡。为了避免每次使用类时都要一遍又一遍地键入,API设计人员通常会创建所谓的方便构造函数或方便方法。+URLWithString:就是其中之一,在内部它看起来是这样的:

代码语言:javascript
复制
+ (id)URLWithString: (NSString *)str {
    return [[[self alloc] initWithString: str] autorelease];
}

因此,会为您调用+alloc-autorelease也是如此。

背景

Objective-C中有两大类方法:类方法和实例方法。类方法被发送到类本身,并且不需要创建该类的实例。实例方法被发送到一个实例,并且可以访问该实例占用的内存。类方法以+开头;实例方法以-开头。

+alloc是一个类方法。它不是一个具有特殊对象创造能力的魔法游戏。它在内部所做的一切就像这样:

代码语言:javascript
复制
+ (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-release等的可可内存管理并不总是Objective-C的一部分,可以创建不使用它的对象。

如果您知道正确的咒语,您实际上可以在不调用+alloc的情况下创建类的实例。我不建议你这么做。

票数 7
EN

Stack Overflow用户

发布于 2011-11-06 22:12:20

使用alloc方法创建一个属于您的新对象。我的意思是像这样创建它

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"],您将成为此对象的所有者。在您使用它之后,让我们说

代码语言:javascript
复制
NSLog ("Url path is %@",url);

您必须释放此对象(url)

代码语言:javascript
复制
[url release];

这是Objective C中关于内存管理的主要主题之一

你的陈述呢,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

我必须说,系统将返回一个带有字符串的url,但它不属于您,所以您不需要释放它,因为系统会自动释放它(自动向此对象发送自动释放消息)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8027512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档