在基于导航的应用中,我在我的应用代理中初始化一个数组而不使用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做任何事情。为什么在第一种情况下失败?
答案 0 :(得分:6)
这是因为self.aArray
使用了合成属性。您将属性定义为(nonatomic, retain)
,这意味着无论设置为何值,都将保留该值。当没有使用它时发生的事情是allKeys
被自动释放,当你实际使用它时,它就消失了。使用该属性保留该值,使其超出其范围。
希望这是有道理的,抱歉,如果我误解了你。
进一步阅读:
我确信那里有更多读者友好的文章,但现在你知道要查找什么:Objective-C内存管理和Objective-C属性。这非常重要,所以我建议你这样做。