GVKun编程网logo

Objective-C(iPhone)ivars和内存管理(ios内存管理的理解)

16

在本文中,您将会了解到关于Objective-C(iPhone)ivars和内存管理的新资讯,同时我们还将为您解释ios内存管理的理解的相关在本文中,我们将带你探索Objective-C(iPhone

在本文中,您将会了解到关于Objective-C(iPhone)ivars和内存管理的新资讯,同时我们还将为您解释ios内存管理的理解的相关在本文中,我们将带你探索Objective-C(iPhone)ivars和内存管理的奥秘,分析ios内存管理的理解的特点,并给出一些关于ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript、iphone – Objective-C:何时调用self.myObject vs只调用myObject、iphone – 我需要释放一个复制的NSObjects – Objective-c、iPhone/Mac Objective-C 内存管理教程和原理剖析 (三)@property (...的实用技巧。

本文目录一览:

Objective-C(iPhone)ivars和内存管理(ios内存管理的理解)

Objective-C(iPhone)ivars和内存管理(ios内存管理的理解)

我是NSURLConnection的子类,并使用MGTwitterEngine作为基础来帮助我开始.这可能是无关紧要的.但是,我注意到他们的代码中没有使用@property或@synthesize作为他们的ivars.他们将ivars包装在accessor方法中,如下所示:

- (Nsstring *)identifier {
  return [[_identifier retain] autorelease];
}

我的问题是两部分.首先,自动释放后保留的效果是什么?在我看来它会取消自己,或者更糟糕但是泄漏.

其次,如果我要更改头文件:

@property (nonatomic,retain,readonly) Nsstring* _identifier;

并使用@synthesize indentifier = _identifier,这不会与访问器方法做同样的事情而不必写它吗?

也许只是两种不同的方式来做同样的事情.但我想确保我有正确的理解.谢谢.

解决方法

使用@synthesize实际上只会创建一个setter和一个getter方法.为您自动生成的代码保证使用适当的内存管理,因此您无需担心.

MGTwitterEngines使用return [[ivar retain] autorelease]实际上是正确的方法.让我们举两个例子.

假设getter定义为:

-(Foo)foo {
    return foo;
}

然后我们执行这段代码:

> bar = [[bar alloc] init]; // bar的计数为1.
> foo = bar.foo; // foo保留计数为1(由bar拥有).
> [酒吧发布]; //酒吧和所有它的ivars都是imidiatetly释放!
> [foo doSomething]; //自上一行发布foo以来,这将崩溃.

如果我们改为将getter更改为:

-(Foo)foo {
    return [[foo retain] autorelease];
}

> bar = [[bar alloc] init]; // bar的保留计数为1
> foo = bar.foo; // foo的保留计数为2(一个由bar拥有,一个由autorelease pool拥有).
> [酒吧发布]; //酒吧和所有它的ivars都是imidiatetly释放!
> [foo doSomething]; //不会崩溃因为foo仍然存在且由autorelease pool拥有.

希望这能解释为什么你应该总是从你所有的getter中返回正确的自动释放对象.重要的是,任何返回值都可以在其父级的解除分配后继续存在,因为没有类可以保证客户端一旦暴露在野外就会对其值进行处理.

ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript

ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript

我最近发现了 eero programming lanugage
我发现它的概念非常有趣.它似乎主要是语法糖,看起来很可读.

虽然它不直接编译到Objective-C,但它声称生成与Objective-C相同的二进制代码

Eero compiles down to the same binary code as Objective-C

Eero offers excellent,nearly seamless interoperability with
Objective-C,C,and C++.

我发现这种方法非常有趣,我想知道是否有类似的编程语言和项目提供与Objective-C和iOS的大腿集成.
我正在为Objective-C寻找类似Coffeescript的东西.

解决方法

虽然使用eero的主要方法是将其编译为本机代码,但它也支持源到源的转换(从eero到标准的Objective-C/C++).有关详细信息,请参阅 https://github.com/eerolanguage/eero/wiki/Translator.

它确实需要记录在一个更明显的地方……

iphone – Objective-C:何时调用self.myObject vs只调用myObject

iphone – Objective-C:何时调用self.myObject vs只调用myObject

在Objective-C中,这一点点语法对我来说有点混乱.

什么时候应该调用self.myObject vs只调用myObject?

这似乎是多余的,但它们不可互换.

有人请赐教吗?

解决方法

如果您只是访问它们,那么没有太多理由使用self.member.如果你正在进行任务,那么如果你做的不仅仅是简单的@property(assign)参数 – 例如,保留,复制等等,那么它可以节省您正在编写的代码.一个例子:

myObject = anotherObject;
self.myObject = anotherObject;

第二个选择将确保您实际上按照您想要的方式分配对象(获取副本,增加保留计数等).它与[self setMyObject:anotherObject]没有什么不同.

由于点符号被编译器替换为消息(类似于x [5]在常规数组工作中变为*(x 5 * sizeof(x))),因此使用点符号时没有开销或额外的效率常规消息.

iphone – 我需要释放一个复制的NSObjects – Objective-c

iphone – 我需要释放一个复制的NSObjects – Objective-c

我想知道我是否需要发布一个复制的NSObject?例如,我只创建一个我复制到数组中的字典:

码:

for (int num = 0; num < [object count]; num++) {
    [dictionary setobject:[object objectAtIndex:num] forKey:@"x"];
    [array addobject:[dictionary copy]];
}

我必须释放字典吗?如果是,什么时候?

谢谢

解决方法

是的你是.在这种情况下,您应该在将其添加到数组后立即释放该副本,因为该数组保留添加到其中的任何内容:

NSDictionary *copied = [dictionary copy];
 [array addobject:copied];
 [copied release];

iPhone/Mac Objective-C 内存管理教程和原理剖析 (三)@property (...

iPhone/Mac Objective-C 内存管理教程和原理剖析 (三)@property (...

 @property (retain) @synthesize 的默认实现

在这里解释一下 @property (retain) ClassB* objB; @synthesize objB; 背后到底发生了什么 (retain property 的默认实现)property 实际上是 getter setter,针对有 retain 参数的 property,背后的实现如下(请参考附件中的 memman-getter-setter.m,你会发现,结果和 memman-property.m 一样):

@interface ClassA : NSObject

{

         ClassB *objB;

}

 

-(ClassB *) getObjB;

-(void) setObjB:(ClassB *) value;

@end

 

@implementation ClassA

-(ClassB*) getObjB

{

         return objB;

}

 

-(void) setObjB:(ClassB*) value

{

         if (objB != value)

         {

                   [objB release];

                   objB = [value retain];

         }

}

setObjB 中,如果新设定的值和原值不同的话,必须要把原值对象 release 一次,这样才能保证 retain count 是正确的。

由于我们在 class 内部 retain 了一次(虽然是默认实现的),所以我们要在 dealloc 方法中 release 这个成员变量。

-(void) dealloc

{

         [objB release];

         [super dealloc];

}

 

 

示例代码文件链接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

我们今天的关于Objective-C(iPhone)ivars和内存管理ios内存管理的理解的分享就到这里,谢谢您的阅读,如果想了解更多关于ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript、iphone – Objective-C:何时调用self.myObject vs只调用myObject、iphone – 我需要释放一个复制的NSObjects – Objective-c、iPhone/Mac Objective-C 内存管理教程和原理剖析 (三)@property (...的相关信息,可以在本站进行搜索。

本文标签: