我想在NSMutableArray中添加一个对象:
NSLog(@"Object text: %@", object.text);
NSLog(@"Object: %@", object);
[appdelegate.objects addObject:object];
NSLog(@"Objects array size: %i", [appdelegate.objects count]);
Run Code Online (Sandbox Code Playgroud)
这是输出:
Object text: This is the text
Object: <Object: 0x6e762c0>
Objects array size: 0
Run Code Online (Sandbox Code Playgroud)
这怎么可能,我添加一个对象,在下一行,它仍然是空的.该NSMutableArray不是nil,因为那样会引发异常.
有谁猜?
我有两个NSArray对象,我想要排序相同.一个包含NSString对象,另一个包含自定义Attribute对象.这是我的"关键"NSArray的样子:
// The master order
NSArray *stringOrder = [NSArray arrayWithObjects:@"12", @"10", @"2", nil];
Run Code Online (Sandbox Code Playgroud)
带有自定义对象的NSArray:
// The array of custom Attribute objects that I want sorted by the stringOrder array
NSMutableArray *items = [[NSMutableArray alloc] init];
Attribute *attribute = nil;
attribute = [[Attribute alloc] init];
attribute.assetID = @"10";
[items addObject:attribute];
attribute = [[Attribute alloc] init];
attribute.assetID = @"12";
[items addObject:attribute];
attribute = [[Attribute alloc] init];
attribute.assetID = @"2";
[items addObject:attribute];
Run Code Online (Sandbox Code Playgroud)
所以,我想要做的是使用stringOrder数组来确定items自定义对象数组的排序.我怎样才能做到这一点?
我有一个NSArray,它给了我以下数据:
01/14/2013 13:28:06.559 IUser Reader [71164: c07] (
{
"id_acompanhante" = "";
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = "Himself";
name = iUser;
status = done;
type = User;
}
{
"id_acompanhante" = 1;
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = iUser;
name = "Mayara Roca";
status = naofeito;
type = companion;
}
)
Run Code Online (Sandbox Code Playgroud)
如何将此数据播放到NSMutableArray并在每个项目中添加另一个字段.例:
{
"id_acompanhante" = "";
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = "Himself";
name = IUser;
status = done;
type = User;
tag …Run Code Online (Sandbox Code Playgroud) 我有一个关于NSArray和NSMutableArray的问题.我理解两者之间的区别主要是NSArray是不可变的,NSMutableArray是可变的.就我的研究而言,性能也是一样的.有一件事我找不到一个好的答案,那就是NSMutableArray使用的内存比NSArray多,如果NSMutableArray在某种程度上比NSArray更苛刻.
我真的很感激建议和解释.
谢谢Vik
我的应用程序中需要一个堆栈ADT.我想避免制作包装纸NSMutableArray; 某个地方的基金会必须有一个有效的实施.
那么,我该如何访问它?
我有一个包含许多对象的NSMutableArray.
如果对数组进行了更改会发生什么,而我使用[NSMutableArray arrayWithArray:someArray]制作数组的副本;
例如:如果一个对象在复制过程中从数组中删除了一个对象?
我不确定如何测试这种情况.
编辑:对象未释放(因为它们保留在其他地方).我只是将这个数组用作查找表.
我希望这与我在这里使用Mutable数组的事实无关,但是这个让我感到困惑,所以如果是这样的话我也不会感到惊讶.
背景:
我创建了一个小型数据库,它本质上是一个包含自定义对象的NSMutableArray,我们可以将其命名为recordObjects.我设置了数组:
database = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)
我的自定义对象,名为"recordObject",包含以下变量和inits:
NSString *name;
int anInt;
Bool aBool;
Run Code Online (Sandbox Code Playgroud)
我也合成了方法,所以我可以拨打电话:
aString = [[database objectAtIndex:someIndex] name];
Run Code Online (Sandbox Code Playgroud)
并添加了我的控制器类的方法来添加,删除和选择要显示的各个记录.到目前为止,一切都正常,完全符合预期.
接下来,我设置了我的recordObject类(NSObject的子类)来使用NSCoder(通过包含在@interface指令中,并在实现文件中添加了以下自定义编码器和解码器方法:
-(void) encodeWithCoder: (NSCoder *) encoder {
[encoder encodeObject: name forKey: @"recordName"];
[encoder encodeInt: anInt forKey: @"recordInteger"];
[encoder encodeBool: aBool forKey: @"recordBool"];
}
-(id) initWithCoder: (NSCoder *) decoder {
name = [decoder decodeObjectForKey: @"recordName"];
anInt = [decoder decodeIntForKey: @"recordInteger"];
aBool = [decoder decodeBoolForKey: @"recordBool"];
}
Run Code Online (Sandbox Code Playgroud)
为了编写文件,我使用了以下内容:
[NSKeyedArchiver archiveRootObject:database toFile:myPath];
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,所有内容都可以正常运行.为阵列中的每个记录调用编码器方法,并将文件写入磁盘.使用TextEdit打开文件会显示数据存在(虽然对我来说几乎无法理解).
问题:
这是我陷入困境的地方.
我添加了以下代码来将文件加载到我的数据库数组中:
database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
Run Code Online (Sandbox Code Playgroud)
当我再次运行程序时,这次加载数据库,它的外观正常工作.我的第一个测试是使用NSMutableArray计数方法: …
我有一种情况,我希望能够维护一个可能都指向nil的指针数组.
Equipment *equipment[19];
Run Code Online (Sandbox Code Playgroud)
但是,我发现我不能将指针数组或双指针设置为对象的属性.
当我不能使用C风格的数组时,我的解决方法是使用NSArray对象.所以我尝试做类似以下的事情:
NSMutableArray *equipment = [NSMutableArray arrayWithCapacity: NUM_EQUIPSLOTS];
for (int i=0; i<NUM_EQUIPSLOTS; i++) {
[equipment setObject: nil atIndexedSubscript: i];
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是我有一个空指针数组,稍后会指向东西.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x246e012 0x1e4be7e 0x2421b6a 0x2421a20 0xebd02 0xde82b 0xc9d5a 0xcb6bd 0x4d525 0xc94fa 0xc8b6a 0xa18157 0xa18747 0xa1994b 0xa2acb5 0xa2bbeb 0xa1d698 0x3176df9 0x3176ad0 0x23e3bf5 0x23e3962 0x2414bb6 0x2413f44 0x2413e1b 0xa1917a 0xa1affc 0xc8526 0x1fa5)
libc++abi.dylib: terminate called throwing an exception
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用C风格的数组和单个对象轻松地完成这项工作.我宁愿这样做而不是像哑巴一样: …
在Objective C中我使用了来自各种线程的NSMutableArray实例,并且我正在使用@synchronized来使其线程安全.目前我对这个数组的所有访问都受到@synchronized块的保护,甚至是objectAtIndex:方法.不过我想知道哪些方法确实需要用@synchronized保护.我需要保护读取权限吗?
如果'ObjectAtIndex'没有受到保护并且在'removeObject'的同时被调用会发生什么?
如果所有方法都受@synchronized保护,性能如何?(我正在写一个tcp/udp游戏服务器,如果它会降低性能或生成锁定,我真的不想过度保护这些数组).
例如,我想'containsObject:'方法将枚举以查找对象,并且我应该避免在另一个线程中对'removeObject:'进行concurent调用.
也许一个好的解决方案是拥有太多不同的锁(用于读写访问)......
欢迎提供帮助和建议!
非常感谢.
请在下面找到示例代码来说明:
@interface TestClass : NSObject
{
NSMutableArray * array;
}
@end
@implementation TestClass
- (id)init
{
self = [super init];
if (self)
{
array = [NSMutableArray array];
}
return self;
}
-(id)objectAtIndex:(NSUInteger)index
{
@synchronized(array) **// IS IT USEFUL OR NOT ??**
{
return [array objectAtIndex:index];
}
}
-(void)removeObject:(id)object
{
@synchronized(array)
{
[array removeObject:object];
}
}
-(void)compute
{
@synchronized(array)
{
for (id object in array)
{
[object compute];
}
}
}
@end
Run Code Online (Sandbox Code Playgroud) 我正在尝试NSMutableArray在Swift中创建一个子类,它支持一个数组文字初始化器.
我可以创建一个简单的子类:
class MyArray: NSMutableArray {
}
Run Code Online (Sandbox Code Playgroud)
初始化工作正常:
let arrayInstance: MyArray = MyArray()
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用数组文字:
let arrayInstance: MyArray = ["one"]
Run Code Online (Sandbox Code Playgroud)
它在运行时失败了[NSMutableArray initWithCapacity:]: method only defined for abstract class..
我可以添加此初始化程序,因此我还必须添加其他所需的初始化程序:
class MyArray: NSMutableArray {
override init(capacity numItems: Int) {
super.init(capacity: numItems)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
required convenience init(arrayLiteral elements: AnyObject...) {
fatalError("init(arrayLiteral:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,第二个必需的初始化程序产生以下编译器错
来自扩展的声明无法覆盖
看起来我被卡住了!任何人都可以建议一种方法来创建一个NSMutableArray支持数组文字的子类吗?否则它会回到Objective-C对我来说!
nsmutablearray ×10
objective-c ×9
ios ×4
nsarray ×4
cocoa ×2
archiving ×1
c ×1
iphone ×1
null ×1
stack ×1
swift ×1
synchronized ×1