为什么“自我”保护的内存空间?(Why does 'self' protect me

2019-10-17 16:49发布

在导航基于应用程序,我初始化我的应用程序委托阵列时不使用自我。 当在RootViewController的的的cellForRowAtIndexPath访问:,所有的数组对象在那里,我可以看到它是一个NSCFArray。 一旦应用程序加载,我点击表格单元格和didSelectRowAtIndexPath方法:,同一阵列有一个类型的NSArray,没有对象,我得到一个EXC_ BAD_ACCESS错误。 如果我先于阵列的应用程序委托自我,一切都很好。 这是为什么?

下面是应用程序的委托.h文件中:

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

  UIWindow *window;
  UINavigationController *navigationController;
  NSMutableDictionary *aDict;
  NSArray *aArray;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSArray *aArray;
@property (nonatomic, retain) NSArray *aDict
@end

阵列和字典中.m文件进行合成。 我初始化这样的应用程序的委托.m文件数组:

aArray = [self.aDict allKeys];

据这样的访问这两个根控制器的方法:

theDelegate = [[UIApplication sharedApplication] delegate]; 
[theDelegate.aArray objectAtIndex:2];

只有当我到达didSelectRowAtIndexPath方法:它失败。 在应用程序的委托这样做使一切工作:

self.aArray = [self.aDict allKeys];

我没有做任何事情来myArray的的cellForRowAtIndexPath之间:和didSelectRowAtIndexPath方法:。 为什么它在第一个方案失败?

Answer 1:

这是因为self.aArray利用合成的财产。 您定义的财产(nonatomic, retain) ,这意味着,无论它被设置为,该值将被保留。 发生了什么事,当你没有使用,这是该allKeys是被自动释放,通过你实际使用它的时候,它已经走了。 使用属性保留的价值,使其成为过去生活的范围。

希望是有道理的,对不起,如果我误解你了。

延伸阅读:

  • 苹果文档-内存管理规则
  • 苹果文档-属性声明
  • 苹果文档- NSAutoreleasePool
  • 问关于如何NSAutoreleasePool厂

我敢肯定,有更多读者友好的文章在那里,但现在你知道要寻找什么了:Objective-C的内存管理,和Objective-C的属性。 这是非常重要的,所以我建议你这样做。



文章来源: Why does 'self' protect memory space?