Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C:发布对象基本问题(非ARC)_Ios_Autorelease_Objective C 2.0 - Fatal编程技术网

Ios 目标C:发布对象基本问题(非ARC)

Ios 目标C:发布对象基本问题(非ARC),ios,autorelease,objective-c-2.0,Ios,Autorelease,Objective C 2.0,关于没有GC的非ARC项目中的内存管理,我有两个新手问题: 在目标C中,当我“自动释放”对象并从方法返回它时,我是否应该在“父方法”中“释放”它,调用重新调整对象的方法 第二个问题是,我从方法(另一个对象上的实例方法,f.e.userService)返回对象(f.e.user),并将其保存到属性(self.userProp,自实例化对象userService并调用他的方法)。当我释放object userService(其方法返回对象用户,存储在property self.userProp中)时

关于没有GC的非ARC项目中的内存管理,我有两个新手问题: 在目标C中,当我“自动释放”对象并从方法返回它时,我是否应该在“父方法”中“释放”它,调用重新调整对象的方法

第二个问题是,我从方法(另一个对象上的实例方法,f.e.userService)返回对象(f.e.user),并将其保存到属性(self.userProp,自实例化对象userService并调用他的方法)。当我释放object userService(其方法返回对象用户,存储在property self.userProp中)时,它也释放了存储在property中的对象(存储在property self.userProp中的对象用户)。为什么?谁是财产中物品的所有者

多谢各位

当我“自动释放”对象并从方法返回它时,我应该 在“父方法”中“释放”它,调用方法重新调整 反对

不,原因是这样的。让我们按照您所说的那样来布置一个示例:

-(NSObject*)someMethodThatReturnsAnAutoreleasedObject {
    return [[[NSObject alloc]init]autorelease];
}

-(void)myMethod {
    NSObject *obj = [self someMethodThatReturnsAnAutoreleasedObject];
    [obj doSomething];
    [obj release] //PROBLEM!
}
逐步查看对象的保留计数,您将看到,虽然
-autorelease
可能不会立即给您造成问题,但它会在稍后的某个日期发生(因为
-autorelease
'd对象不是“自动释放”,而是在其拥有的池耗尽或释放时,它们被集体释放)。返回自动释放对象的方法返回该对象的最终保留计数为0(0(开始)+1(alloc)-1(自动释放)),因此释放该对象不仅没有必要,而且会导致崩溃

第二个问题是,我从方法返回了对象(f.e.user) (另一个对象上的实例方法,f.e.userService)并将其保存到 属性(self.userProp,自实例化对象userService和 称为他的方法)。当我发布object userService(谁的 方法返回对象用户,该对象存储在属性self.userProp)中 还发布了存储在属性中的对象(存储在中的对象用户 属性self.userProp)。为什么?这件物品的主人是谁 财产

再次强调,先进行一点设置(这在一开始是相当复杂的,但在你看到你正在做的事情之后才完全有意义)

那么,这有什么不同呢?记忆限定符,这就是为什么!当您声明一个属性时,您将声明一组内存限定符,以告知编译器要附加到赋值符号的修饰符类型。大多数属性都声明为
retain
或strong((在ARC下),如果它们是对象类型,则希望您的
userService
one也声明为strong,这会使编译器进行解释

self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];
作为


因此,您必须释放它,否则您的手上会有漏洞(0(开始)+1(alloc)-1(自动释放)+1(保留)=+1)。

谢谢,我的代码有些混乱。你的解释很好,在我的测试控制台应用程序中,它就像一个魅力。
self.userservice = [self someMethodThatReturnsAnAutoreleasedObject];
self.userservice = [[self someMethodThatReturnsAnAutoreleasedObject]retain];