4th*_*ace 1 iphone xcode memory-management objective-c
在基于导航的应用程序中,我在我的应用程序委托中初始化一个数组而不使用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
Run Code Online (Sandbox Code Playgroud)
数组和字典在.m文件中合成.我在app delegate .m文件中初始化数组,如下所示:
aArray = [self.aDict allKeys];
Run Code Online (Sandbox Code Playgroud)
在两个根控制器方法中都可以这样访问它:
theDelegate = [[UIApplication sharedApplication] delegate];
[theDelegate.aArray objectAtIndex:2];
Run Code Online (Sandbox Code Playgroud)
只有当我到达didSelectRowAtIndexPath时才会失败.在app delegate中执行此操作可使一切正常:
self.aArray = [self.aDict allKeys];
Run Code Online (Sandbox Code Playgroud)
我没有对cellForRowAtIndexPath:和didSelectRowAtIndexPath:之间的myArray做任何事情.为什么在第一种情况下失败?
那是因为self.aArray利用了合成的属性.您将属性定义为(nonatomic, retain),这意味着无论设置为何值,都将保留该值.当你没有使用它时发生的事情allKeys就是自动释放,当你实际使用它时,它就消失了.使用该属性保留该值,使其超出其范围.
希望有道理,对不起,如果我误解了你.
进一步阅读:
我确信有更多读者友好的文章,但现在你知道要查找什么:Objective-C内存管理和Objective-C属性.这非常重要,所以我建议你这样做.
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |