use*_*076 35 objective-c nsarray ios
我有一个NSMutableArray
对象(保留,合成为全部),启动得很好,我可以使用该addObject:
方法轻松地向其添加对象.但是如果我想用一个新的替换某个索引处的某个对象NSMutableArray
,它就不起作用了.
例如:
ClassA.h
:
@interface ClassA : NSObject {
NSMutableArray *list;
}
@property (nonatomic, copy, readwrite) NSMutableArray *list;
@end
Run Code Online (Sandbox Code Playgroud)
ClassA.m
:
#import "ClassA.h"
@implementation ClassA
@synthesize list;
- (id)init
{
[super init];
NSMutableArray *localList = [[NSMutableArray alloc] init];
self.list = localList;
[localList release];
//Add initial data
[list addObject:@"Hello "];
[list addObject:@"World"];
}
// Custom set accessor to ensure the new list is mutable
- (void)setList:(NSMutableArray *)newList
{
if (list != newList)
{
[list release];
list = [newList mutableCopy];
}
}
-(void)updateTitle:(NSString *)newTitle:(NSString *)theIndex
{
int i = [theIndex intValue]-1;
[self.list replaceObjectAtIndex:i withObject:newTitle];
NSLog((NSString *)[self.list objectAtIndex:i]); // gives the correct output
}
Run Code Online (Sandbox Code Playgroud)
但是,仅在方法内部仍然存在变化.从任何其他方法,
NSLog((NSString *)[self.list objectAtIndex:i]);
Run Code Online (Sandbox Code Playgroud)
给出相同的旧值.
如何在特定索引处实际将旧对象替换为新对象,以便可以从任何其他方法中注意到更改.
我甚至修改了这样的方法,但结果是一样的:
-(void)updateTitle:(NSString *)newTitle:(NSString *)theIndex
{
int i = [theIndex intValue]-1;
NSMutableArray *localList = [[NSMutableArray alloc] init];
localList = [localList mutableCopy];
for(int j = 0; j < [list count]; j++)
{
if(j == i)
{
[localList addObject:newTitle];
NSLog(@"j == 1");
NSLog([NSString stringWithFormat:@"%d", j]);
}
else
{
[localList addObject:(NSString *)[self.list objectAtIndex:j]];
}
}
[self.list release];
//self.list = [localList mutableCopy];
[self setList:localList];
[localList release];
}
Run Code Online (Sandbox Code Playgroud)
请帮帮忙:)
Már*_*lho 126
这样做的诀窍:
[myMutableArray replaceObjectAtIndex:index withObject:newObject];
Run Code Online (Sandbox Code Playgroud)
好的,这里有一些混乱.
您不需要mutableCopy
使用新创建的NSMutableArray
它来使其变得可变.它已经是可变的 - 线索就在名字中.如果您希望属性具有copy
语义(您已经设置了,当然可能有充分的理由),您只需要在setter中执行此操作.但是你肯定不需要像你更新的updateTitle
代码中所示那样做,并且这样做会泄漏localList
.
此外,您通过相同的方法将属性访问混合在一起self.list
并直接使用list
.这不是无效的,但这是不好的做法,因为它意味着访问者方法所做的任何其他事情都被随机绕过.这是常见的这样的特性,通过做的一切self
,除了在存取自己,或者dealloc
,也可能在init
(意见似乎在此不同),在那里你会直接访问伊娃.
此外,永远不要打电话[self.list release]
- 属性访问者不会给予其来电者所有权.这样做会以泪水结束,标记我的话.
这些都没有回答真正的问题,这就是为什么你的改变正在消失.updateTitle
就我所见,原始代码没有解释这一点 - 它应该有效.所以我怀疑你正在呼唤的其他地方self.list = theOriginalList
,从而撤消你的改变.
更新:
为了讨论的缘故,我要发布什么,我认为你发布的代码可能是指的样子.我保留了使用字符串来传递索引updateTitle
,但我想指出这样做是错误的.这是一个数字,你应该这样传递它.即使数字来自文本字段或其他内容,这也是调用者的关注点; 类接口应该指定一个数字.类似地,从基于1的索引到基于0的索引的明显变化.请不要暗中做这种事情,这是一种哭泣和咬牙切齿的方法.
ClassA.h:
#import <Cocoa/Cocoa.h>
@interface ClassA : NSObject
{
NSMutableArray* list;
}
- (void) setList:(NSMutableArray*)newList;
- (void) updateTitle:(NSString*)newTitle forIndex:(NSString*)theIndex;
@property (nonatomic, copy, readwrite) NSMutableArray* list;
@end
Run Code Online (Sandbox Code Playgroud)
ClassA.m:
#import "ClassA.h"
@implementation ClassA
@synthesize list;
- (id) init
{
if ( self = [super init] )
{
list = [[NSMutableArray alloc] init];
[list addObject:@"Hello "];
[list addObject:@"World"];
}
return self;
}
- (void) setList:(NSMutableArray*) newList
{
if ( list != newList )
{
[list release];
list = [newList mutableCopy];
}
}
- (void) updateTitle:(NSString*)newTitle forIndex:(NSString*)theIndex
{
int i = [theIndex intValue] - 1;
[self.list replaceObjectAtIndex:i withObject:newTitle];
}
- (void) dealloc
{
[list release];
[super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)
这清除了各种问题,但请注意updateTitle
大致相同.如果你放弃所有这些并且更改仍然无法生存,那么你肯定会重置list
某个地方.
一个更直接的答案是:
self.list[i] = newTitle;
Run Code Online (Sandbox Code Playgroud)
这就像
[self.list replaceObjectAtIndex:i withObject:newTitle];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
80229 次 |
最近记录: |