簡體   English   中英

ARC內存管理:@Property(非原子,強)VS實例變量

[英]ARC Memory management : @Property (nonatomic, strong) VS instance variable

我發現在Xcode(分配)中使用概要分析工具發現的是,當您刪除一個屬性時,直到父類被刪除為止,它不會被釋放。 現在,假設您要確保不要在內存中保留昂貴的模式視圖控制器(假設它不會經常使用),如果昂貴的VC是一個屬性,則不會為該屬性分配的內存當屬性消失時被釋放,這意味着當用戶想要再次使用昂貴的VC時,我們將每次分配相同數量的內存。 這很容易在探查器中發現,因為圖形一直在不斷攀升。

但是,如果僅將昂貴的VC定義為實例變量並定義自己的setter&getter,則當變量被清除后,探查器分配圖實際上會立即減小,並在每次新分配時以相同的數量返回。

所以我的問題是,為什么變量“似乎”在定義為實例變量時卻被釋放,而在定義為屬性時卻沒有?

// 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;

AFAIK,您不能強迫對象釋放其所有內存,直到其父級調用解除分配,然后其所有子級都被級聯釋放。。https ://stackoverflow.com/a/7631831/2536815

我認為您的分析不正確。 如果正確使用,則屬性和實例變量對引用計數都具有相同的效果:將其設置為nil會減少引用計數器,如果將其設置為0,則會立即釋放該實例(無論是視圖控制器還是其他對象)。

如果您的應用程序中不是這種情況,則原因必須是屬性與實例變量不同。

為了進一步分析您的特定問題,我們將需要更多信息。 因此,請發布您的代碼,描述用於測量內存管理效果的設置,有效結果以及期望的結果。

因此,似乎我只是將隱藏/顯示一個昂貴的視圖與分配/微調混淆了,當視圖不可見時內存圖就會下降,反之亦然,我知道我真的很傻。

只是為了驗證您不能強迫弧釋放屬性/ ivar,我創建了一個新的xcode項目,將代碼放在了didFinishLaunching方法中。 不幸的是,無論是否取消它們,分配給該屬性和ivar的內存都保留在內存中。 在我的情況下,下面的代碼生成2.8 MB的內存,當此方法完成並且應用程序啟動時,探查器的內存圖將無限期保持在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM