标签: nsmutablearray

addObject后NSMutableArray为空

我想在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,因为那样会引发异常.

有谁猜?

objective-c nsmutablearray ios

7
推荐指数
1
解决办法
6271
查看次数

根据另一个NSArray字符串的排序对自定义对象的NSArray进行排序

我有两个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自定义对象数组的排序.我怎样才能做到这一点?

objective-c nsmutablearray nsarray ios

7
推荐指数
2
解决办法
5388
查看次数

从NSArray Objective-C创建NSMutableArray

我有一个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)

iphone objective-c nsmutablearray nsarray

7
推荐指数
2
解决办法
9065
查看次数

出于内存原因,NSMutableArray比NSArray更好吗?

我有一个关于NSArray和NSMutableArray的问题.我理解两者之间的区别主要是NSArray是不可变的,NSMutableArray是可变的.就我的研究而言,性能也是一样的.有一件事我找不到一个好的答案,那就是NSMutableArray使用的内存比NSArray多,如果NSMutableArray在某种程度上比NSArray更苛刻.

我真的很感激建议和解释.

谢谢Vik

memory-management objective-c nsmutablearray nsarray ios

7
推荐指数
1
解决办法
1782
查看次数

Objective C中是否有可以导入和使用的Stack类?

我的应用程序中需要一个堆栈ADT.我想避免制作包装纸NSMutableArray; 某个地方的基金会必须有一个有效的实施.

那么,我该如何访问它?

cocoa stack objective-c nsmutablearray

6
推荐指数
1
解决办法
3986
查看次数

如果NSMutableArray同时被多个线程修改会发生什么?(如果它包含的对象保留在别处)

我有一个包含许多对象的NSMutableArray.

如果对数组进行了更改会发生什么,而我使用[NSMutableArray arrayWithArray:someArray]制作数组的副本;

例如:如果一个对象在复制过程中从数组中删除了一个对象?

我不确定如何测试这种情况.

编辑:对象未释放(因为它们保留在其他地方).我只是将这个数组用作查找表.

multithreading objective-c nsmutablearray

6
推荐指数
2
解决办法
3066
查看次数

NSKeyedArchiver和NSKeyedUnarchiver与NSMutableArray

我希望这与我在这里使用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计数方法: …

cocoa objective-c archiving nsmutablearray nskeyedarchiver

6
推荐指数
1
解决办法
1万
查看次数

为什么我不能将nil对象添加到NSMutableArrays?

我有一种情况,我希望能够维护一个可能都指向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风格的数组和单个对象轻松地完成这项工作.我宁愿这样做而不是像哑巴一样: …

c null objective-c nsmutablearray nsarray

6
推荐指数
2
解决办法
4148
查看次数

NSMutableArray集合和@Synchronized块

在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)

multithreading objective-c synchronized nsmutablearray ios

6
推荐指数
1
解决办法
2463
查看次数

在Swift中创建NSMutabaleArray子类

我正在尝试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 swift

6
推荐指数
1
解决办法
930
查看次数