Iphone 财产转让和分配导致保留计数2

Iphone 财产转让和分配导致保留计数2,iphone,objective-c,cocoa-touch,xcode,memory-management,Iphone,Objective C,Cocoa Touch,Xcode,Memory Management,我看了一下仪器,发现alloc将保留计数增加了1。到目前为止一切都很清楚。但将该类分配给我的属性也将保留计数增加到了2 self.myProperty = [[MyClass alloc] init] Vs 为了将保留计数减少到零,我在调用之后立即释放了myCreatedVariable。myProperty实例变量在dealloc方法中释放。仅在dealloc方法中发布属性,这对吗 现在回答我的问题: 财产的分配和分配是否总是产生2的保留计数?所以不要使用 self.myProperty =

我看了一下仪器,发现alloc将保留计数增加了1。到目前为止一切都很清楚。但将该类分配给我的属性也将保留计数增加到了2

self.myProperty = [[MyClass alloc] init]
Vs

为了将保留计数减少到零,我在调用之后立即释放了myCreatedVariable。myProperty实例变量在dealloc方法中释放。仅在dealloc方法中发布属性,这对吗

现在回答我的问题:

财产的分配和分配是否总是产生2的保留计数?所以不要使用

self.myProperty = [[MyClass alloc] init]
因为保留计数永远不会变为零?或者这只是我分配课程时的情况


干杯

您的财产很可能被声明为保留或复制:

@property (retain) MyClass myProperty;

这将调用执行其属性所述操作的setter:retain!副本也将保留

尽管它在这里起作用,但您不应该试图从retainCount属性中获取有用的信息


我无法推荐足够高、值得一读、二读和三读的书籍。:-)

您的属性很可能声明为保留或复制:

@property (retain) MyClass myProperty;

这将调用执行其属性所述操作的setter:retain!副本也将保留

尽管它在这里起作用,但您不应该试图从retainCount属性中获取有用的信息


我无法推荐足够高、值得一读、二读和三读的书籍。:-)

默认情况下,使用init函数创建对象会返回保留的实例。(请参阅《内存管理编程指南》)

如果属性是使用“retain”属性定义的,则对象将再次被保留

所以正确的方法是

MyClass *myCreatedVariable = [[MyClass alloc] init];
self.myProperty = myCreatedVariable;
[myCreatedVariable release];
顺便说一下,当您使用数组时,了解这一点也很好。 一旦使用alloc和init函数创建的对象被添加到数组中,它将被数组保留,因此您可以在将实例添加到数组中后释放它

在这两种情况下,retainCount都是1,正如预期的那样

如果您的属性是用“copy”属性定义的,那么您也可以释放对象,甚至杀死它,因为它已经被完全复制并保留了一次。 (我认为如果您使用垃圾收集而不是托管内存…来检查…会有一些问题)

最后,如果属性设置为“assign”属性,则只复制对象的地址,因此在这种情况下不应释放原始对象

但是,不建议使用“assign”属性,因为您可以使用非自己创建的对象设置属性,这些对象可以随时释放,让属性指向字段

最后,不要忘记Cocoa中的静态创建者不会返回保留的对象。 (这是一项惯例,可能存在例外情况……)

例如:

NSArray* myArray = [NSArray array];
self.myProperty = myArray;
在这种情况下,不要释放myArray,它已经在creator函数中完成了。 将其指定给属性将保留它。(使用retain或copy属性)

希望有帮助,


Cheers

使用init函数创建对象时,默认情况下会返回保留的实例。(请参阅《内存管理编程指南》)

如果属性是使用“retain”属性定义的,则对象将再次被保留

所以正确的方法是

MyClass *myCreatedVariable = [[MyClass alloc] init];
self.myProperty = myCreatedVariable;
[myCreatedVariable release];
顺便说一下,当您使用数组时,了解这一点也很好。 一旦使用alloc和init函数创建的对象被添加到数组中,它将被数组保留,因此您可以在将实例添加到数组中后释放它

在这两种情况下,retainCount都是1,正如预期的那样

如果您的属性是用“copy”属性定义的,那么您也可以释放对象,甚至杀死它,因为它已经被完全复制并保留了一次。 (我认为如果您使用垃圾收集而不是托管内存…来检查…会有一些问题)

最后,如果属性设置为“assign”属性,则只复制对象的地址,因此在这种情况下不应释放原始对象

但是,不建议使用“assign”属性,因为您可以使用非自己创建的对象设置属性,这些对象可以随时释放,让属性指向字段

最后,不要忘记Cocoa中的静态创建者不会返回保留的对象。 (这是一项惯例,可能存在例外情况……)

例如:

NSArray* myArray = [NSArray array];
self.myProperty = myArray;
在这种情况下,不要释放myArray,它已经在creator函数中完成了。 将其指定给属性将保留它。(使用retain或copy属性)

希望有帮助,


干杯

对不起?不。恐怕编程就是想知道我们每天都不知道的事情

静态创建者是一种方便的功能,可以简化常见对象的分配。 cocoa框架中的许多类都具有这种函数。数组、字典、路径

让我们以您的类为例,假设您经常需要创建此类的对象。您可以在“myClass”实现中编写函数,如:

+(MyClass*)myClass
{
  MyClass *myNewInstance = [[myNewInstance alloc] init];
  return [myNewInstance autorelease];
}
然后,您可以将原始示例改写为:

..
self.myProperty = [MyClass myClass];
..
直! 或者你可以写一个方法,比如

-(void)myFunction
{
  MyClass* myTempObject = [MyClass myClass];
  if (myTempObject) {
    // do something with your temporary object
  }
  // Simply exit, object will be released later on.
}
它要短得多(我们应该处理对象创建失败的情况)

请注意,这是所有约定,您基本上可以按照自己的喜好创建保留对象,或者为创建者使用不同的名称。 但是遵循框架规则更安全,当您编写代码时,它会成为一种反射。 请参阅像[NSDictionary dictionary]、[NSArray array]、[NSArray arrayWithObjects:]、


干杯

对不起?不。恐怕编程就是想知道我们每天都不知道的事情

静态创建者是一种方便的功能,可以简化常见对象的分配。 可可园里有很多班级
self.strURL = [NSString stringWithString:@"http://192.168.1.25/shop.php"];
strURL = [NSString stringWithString:@"http://192.168.1.25/shop.php"];
strURL = [[NSString alloc] stringWithString:@"http://192.168.1.25/shop.php"];