使用 initWithObjects: 会导致崩溃,但 initWithCapacity: 后跟 addObject: 不会崩溃

发布于 2024-12-21 09:04:11 字数 905 浏览 3 评论 0原文

一个非常奇怪的问题。我必须在 - (void)viewDidLoad 中初始化一个数组。

数组 prjMemberArray 被声明为属性:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

如果我将其

prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone",@"someone",@"someone" ,nil];

与在 viewDidUnload 中调用的 release 一起使用,

那么当视图加载时,它将崩溃立即但是当我使用这个时:

prjMemberArray = [[NSMutableArray alloc] initWithCapacity:0];

[prjMemberArray addObject:@"someone"];

效果很好。谁能解释一下吗?我使用故事板来呈现当前视图控制器,如下所示:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];  
prj_Detail = [sb instantiateViewControllerWithIdentifier:@"ProjectDetailVC"]; 

[self presentModalViewController:prj_Detail animated:YES];

其中 prjMemberArray 是 prj_Detail 的属性。

A really strange problem. I have to init an array in - (void)viewDidLoad.

The array, prjMemberArray is declared as a property:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

If I use this

prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone",@"someone",@"someone" ,nil];

with release called in viewDidUnload,

then when the view loaded , it will crashes immediately But when I use this:

prjMemberArray = [[NSMutableArray alloc] initWithCapacity:0];

[prjMemberArray addObject:@"someone"];

it works well. Can anyone explain this? I use a storyboard to present the current view controller, like this:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];  
prj_Detail = [sb instantiateViewControllerWithIdentifier:@"ProjectDetailVC"]; 

[self presentModalViewController:prj_Detail animated:YES];

Where prjMemberArray is a property of prj_Detail.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

关于从前 2024-12-28 09:04:11

您确定您没有拼写错误的项目并在崩溃场景中编写了例如 "someone" 而不是 @"someone" 吗?

Are you sure you have not misspelled items and written e.g. "someone" instead of @"someone" in the crashing scenario?

私藏温柔 2024-12-28 09:04:11

引用属性时不要忘记使用 self。这是一种安全的声明方式,无需担心泄漏:

标头:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

实现:

@synthesize prjMemberArray=_prjMemberArray;

- (void) viewDidLoad {

    [super viewDidLoad];

    NSMutableArray *prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone", @"someone", @"someone" ,nil];

    self.prjMemberArray = prjMemberArray;

    [prjMemberArray release];
}

- (void) dealloc {

    [_prjMemberArray release];

    [super dealloc];
}

@property 为变量创建 getter 和 setter,但经常与变量本身混淆。当他们发布 XCode4 时,我相信他们添加了通过执行以下操作来设置您希望实例变量命名的功能:

@synthesize prjMemberArray=_prjMemberArray;

在 XCode4 之前,您只需执行以下操作:

@synthesize prjMemberArray;

那么 @property 在幕后所做的事情有点像这样:

-(NSMutableArray*) prjMemberArray {
    return _prjMemberArray;
}

-(void) setPrjMemberArray:(NSMutableArray *) val {
    if( _prjMemberArray != nil )
        [prjMemberArray release];

    _prjMemberArray = [val retain];
}

所以不要将 @property 视为变量本身,并记住在引用它们时始终使用 self 。这应该可以避免你很多痛苦,也可以避免一些内存泄漏。

Don't forget to use self when referring to properties. Here's the a safe way to declare that without having to worry about leaks:

Header:

@property(nonatomic, retain) NSMutableArray* prjMemberArray;

Implementation:

@synthesize prjMemberArray=_prjMemberArray;

- (void) viewDidLoad {

    [super viewDidLoad];

    NSMutableArray *prjMemberArray = [[NSMutableArray alloc] initWithObjects:@"someone", @"someone", @"someone" ,nil];

    self.prjMemberArray = prjMemberArray;

    [prjMemberArray release];
}

- (void) dealloc {

    [_prjMemberArray release];

    [super dealloc];
}

@property creates the getter and setter for your variable but is often confused for a variable itself. When they released XCode4 I believe they added the ability to set what you want the instance variable to be named by doing:

@synthesize prjMemberArray=_prjMemberArray;

Before XCode4 you simply did:

@synthesize prjMemberArray;

So what @property is doing behind the scenes is a little something like this:

-(NSMutableArray*) prjMemberArray {
    return _prjMemberArray;
}

-(void) setPrjMemberArray:(NSMutableArray *) val {
    if( _prjMemberArray != nil )
        [prjMemberArray release];

    _prjMemberArray = [val retain];
}

So don't think of @property as a variable itself and remember to always use self when referring to them. That should save you a lot of pain and a few memory leaks as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文