我有点理解什么是自动保存和释放的,但我找不到任何官方数据,我想我搞错了。
self.的情况下在同一个对象内设置属性我有什么不对/忘了什么吗?
当返回被丢弃时会发生什么?就像[object someMethodThatReturnsAnObject];。它将不是它返回的方法的本地的,所以我不确定它是否会被释放,并且xCode警告它。
发布于 2011-06-16 20:12:41
而不是猜测,阅读文件。这是确定的。
设置使用@property( retain )声明的属性将保留和释放旧值,但不会在没有self的情况下在同一个对象中设置属性。
说大也大吧。没有“设置没有自我的属性”。即直接设置实例变量。
方法中的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。
不,去看医生。
方法返回的对象不会被释放,而是将由其返回的方法释放,因为它在方法中的局部变量。
一点也不;看医生。
发布于 2011-06-16 20:16:43
设置使用@property( retain )声明的属性将保留和释放旧值,但不会在没有self的情况下在同一个对象中设置属性。
调用为retain属性合成的setter方法将释放旧值并保留新值。直接设置一个象牙人,而不经过你的访问者,只会分配这个象牙人。它既不会保留也不会释放任何东西。self.foo = bar正是[self setFoo:bar]。无论setFoo:做什么,都会完成(合成的setFoo:保留版本就像上面所描述的那样工作)。foo = bar正是foo = bar。
方法中的所有对象(包括参数)在创建/传递时保留,并在方法返回时释放。
这根本不是事实。他们既不保留也不释放。保持和释放不是神奇的发生。这是在响应对alloc、new、copy、retain和release的调用时发生的。使用点表示法只是方法调用的一个简短操作,其中可能包含一个retain。
方法返回的对象不会被释放,而是将由其返回的方法释放,因为它在方法中的局部变量。
这不是真的。方法返回的对象既不保留也不释放。按照惯例,名为alloc、new或copy的方法将返回net +1 retain。任何其他方法都将返回一个NET0保留计数(对象上的自动释放将与保留的数量一样多)。“当前”保留计数将始终大于0,否则无法返回对象。(这是对事实的轻微掩饰。在这两种情况下,如果存在私有保留,则保留计数可能大于1。但从调用者的角度来看,这是一种很有用的思考方法。)
最好的地方是实用内存管理,它非常简洁地展示了这一切。其余的内存管理编程指南将给出更多的例子。
发布于 2011-06-16 20:24:20
“自动”这个词有点吓人。这意味着,在后台运行时以某种方式神奇地应用了保留和发布。实际上,保留某物的唯一时间是发送一条包含以下内容之一的消息时:New Alloc Retain Copy (N.A.R.C)。唯一的发布时间是当它被发送到发布消息或自动释放消息时。所以你真正需要理解的是,这些方法是在什么情况下发送的?
1.设置属性
你说得对,就你所做的。为什么?因为属性只是生成getter和setter方法的语法糖。例如,self.myString = @"Foo";与[self setMyString:@"Foo"]完全相同。您需要理解的是,当您声明一个具有保留语义的属性时,您实际上得到了如下所示的方法:
- (void)setMyString:(NSString *)newString {
if ( newString != myString ) {
[myString release];
myString = [newString retain];
}
}因此,很明显,说self.myString = someOtherString将导致保留新的值。您所指的“设置没有self.的属性”实际上只是直接分配ivar。因为没有使用点运算符,也没有调用任何方法,所以您知道没有保留任何内容。
2和3.与方法范围有关的事情?
这两种说法都不是真的。按照惯例,返回我的方法的变量在名称中没有NARC的痕迹,将自动释放。这是真正遵循惯例的方法作者。任何东西都不会因为方法调用而自动保留或释放。
https://stackoverflow.com/questions/6377858
复制相似问题