在本文中,您将会了解到关于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内存管理的理解)
- 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内存管理的理解)
- (Nsstring *)identifier { return [[_identifier retain] autorelease]; }
我的问题是两部分.首先,自动释放后保留的效果是什么?在我看来它会取消自己,或者更糟糕但是泄漏.
其次,如果我要更改头文件:
@property (nonatomic,retain,readonly) Nsstring* _identifier;
并使用@synthesize indentifier = _identifier,这不会与访问器方法做同样的事情而不必写它吗?
也许只是两种不同的方式来做同样的事情.但我想确保我有正确的理解.谢谢.
解决方法
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
我发现它的概念非常有趣.它似乎主要是语法糖,看起来很可读.
虽然它不直接编译到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的东西.
解决方法
它确实需要记录在一个更明显的地方……
iphone – Objective-C:何时调用self.myObject vs只调用myObject
什么时候应该调用self.myObject vs只调用myObject?
这似乎是多余的,但它们不可互换.
有人请赐教吗?
解决方法
myObject = anotherObject; self.myObject = anotherObject;
第二个选择将确保您实际上按照您想要的方式分配对象(获取副本,增加保留计数等).它与[self setMyObject:anotherObject]没有什么不同.
由于点符号被编译器替换为消息(类似于x [5]在常规数组工作中变为*(x 5 * sizeof(x))),因此使用点符号时没有开销或额外的效率常规消息.
iphone – 我需要释放一个复制的NSObjects – Objective-c
码:
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 (...
三 @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];
}
我们今天的关于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 (...的相关信息,可以在本站进行搜索。
本文标签: