Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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 ARC内存管理:@属性(非原子,强)VS实例变量_Ios_Objective C_Automatic Ref Counting - Fatal编程技术网

Ios ARC内存管理:@属性(非原子,强)VS实例变量

Ios ARC内存管理:@属性(非原子,强)VS实例变量,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,我在Xcode(分配)中使用分析工具发现,当您取消一个属性时,它不会被解除分配,直到父类取消取消。现在让我们假设您希望确保内存中不保留昂贵的模态视图控制器(假设它不会经常使用),如果昂贵的VC是一个属性,则当该属性为零时,为该属性分配的内存将不会释放,这意味着,当用户想要再次使用昂贵的VC时,我们将每次分配相同数量的内存。这很容易在分析器中发现,因为图形一直在上升 然而,如果我只将昂贵的VC定义为一个实例变量,并定义我自己的setter&getter,那么当变量被nilled out时,prof

我在Xcode(分配)中使用分析工具发现,当您取消一个属性时,它不会被解除分配,直到父类取消取消。现在让我们假设您希望确保内存中不保留昂贵的模态视图控制器(假设它不会经常使用),如果昂贵的VC是一个属性,则当该属性为零时,为该属性分配的内存将不会释放,这意味着,当用户想要再次使用昂贵的VC时,我们将每次分配相同数量的内存。这很容易在分析器中发现,因为图形一直在上升

然而,如果我只将昂贵的VC定义为一个实例变量,并定义我自己的setter&getter,那么当变量被nilled out时,profiler分配图实际上会立即减少,并在每次新分配时以相同的数量返回

所以我的问题是,为什么变量在定义为实例变量时“似乎”被释放,而在定义为属性时却没有

// What I call defining something as an instance variable:
@interface SomeViewController ()
{
    UIPopoverController *somePopover;
}

// What I call defining something as a property
@property (nonatomic,strong) UIPopoverController *somePopover;

// Nilling out a property which does not get allocated unless it does not have a parent (root node memory graph wise)
self.somePopover = nil;

// Nilling out an instance variable which does make the memory graph in the profiler go down by the same amount it went up
somePopover = nil;
好的,你不能强迫一个对象释放它的所有内存,直到它的父对象调用deallocate,然后它的所有子对象都得到cascade deallocate。。
我认为你的分析不正确。如果使用得当,属性和实例变量对引用计数的影响相同:将其设置为nil将减少引用计数器,如果设置为0,则实例(无论是视图控制器还是其他对象)将立即释放

如果应用程序中不是这种情况,那么原因一定不是属性与实例变量


为了进一步分析您的具体问题,我们需要更多信息。因此,请发布您的代码,描述用于测量内存管理效果的设置,有效的结果是什么,以及您希望得到什么。

因此,我似乎把隐藏/显示昂贵的视图与分配/禁用混淆了,当视图不可见时,内存图会下降,反之亦然,我知道我真傻

为了验证您不能强制arc释放属性/ivar,我创建了一个新的xcode项目,我将下面的代码放在didFinishLaunching方法中。不幸的是,为属性和ivar分配的内存都保留在内存中,无论我是否将它们置零。在我的例子中,下面的代码生成2.8MB的内存,当此方法完成并且应用程序启动时,探查器内存图将无限期地保持在2.8MB

@interface SSAppDelegate ()
{
    NSMutableArray *ivVC;
}
@property (nonatomic, strong) NSMutableArray *propertyVC;
@end
@implementation SSAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{



for (int k=0; k<10; k++) {
    ivVC = [NSMutableArray array]; // Doesn't matter if it's alloc] init]
    self.propertyVC = [NSMutableArray array]; 

    for (int i=0; i<1000;i++) {
        [ivVC addObject:@"..................................................................................."];
        [_propertyVC addObject:@"..................................................................................."];

    }

    ivVC = nil;
    self.propertyVC = nil;
}

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
@接口SSAppDelegate()
{
NSMutableArray*ivVC;
}
@属性(非原子,强)NSMutableArray*propertyVC;
@结束
@实现SSAppDelegate
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{

对于(int k=0;k对于(强)属性“vc”(带弧和默认设置器)
\u vc=nil
self.vc=nil
之间应该没有区别。两者都会将保留计数减少一,如果没有其他引用,则对象会被释放。arc有时会将内容添加到自动释放池中,并且它们不会在池被释放之前在@autoreleasepoolarc中释放=nils向游泳池中添加了一些东西,但在游泳池中的水排干之前,它们不会被释放