为什么'self'会保护内存空间?

时间:2009-09-26 18:42:01

标签: objective-c iphone xcode memory-management

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

以下是app delegate .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文件中合成。我在app delegate .m文件中初始化数组,如下所示:

aArray = [self.aDict allKeys];

在两个根控制器方法中都可以这样访问:

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

只有当我到达didSelectRowAtIndexPath时才会失败。在app delegate中执行此操作可以使一切正常运行:

self.aArray = [self.aDict allKeys];

我没有对cellForRowAtIndexPath:和didSelectRowAtIndexPath:之间的myArray做任何事情。为什么在第一种情况下失败?

1 个答案:

答案 0 :(得分:6)

这是因为self.aArray使用了合成属性。您将属性定义为(nonatomic, retain),这意味着无论设置为何值,都将保留该值。当没有使用它时发生的事情是allKeys被自动释放,当你实际使用它时,它就消失了。使用该属性保留该值,使其超出其范围。

希望这是有道理的,抱歉,如果我误解了你。

进一步阅读:

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