Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 有没有人有使用encodeBytes:length:forKey:的示例代码?_Ios_Objective C - Fatal编程技术网

Ios 有没有人有使用encodeBytes:length:forKey:的示例代码?

Ios 有没有人有使用encodeBytes:length:forKey:的示例代码?,ios,objective-c,Ios,Objective C,显然,我的NSCoder类需要它,如果我能看到一个真实的例子及其相应的方法,它将非常有用 我觉得需要它的原因是当我的方法尝试为NSString*编码对象时,它抱怨说: 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'*-encodeBytes:长度:forKey:仅为抽象类定义。定义-[JSONECODER ENCODER encodeBytes:length:forKey:!' 谢谢 jsonecoder()中的方法我无法让静态库工作,所以我尝试直

显然,我的NSCoder类需要它,如果我能看到一个真实的例子及其相应的方法,它将非常有用

我觉得需要它的原因是当我的方法尝试为NSString*编码对象时,它抱怨说:

由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'*-encodeBytes:长度:forKey:仅为抽象类定义。定义-[JSONECODER ENCODER encodeBytes:length:forKey:!'

谢谢

jsonecoder()中的方法我无法让静态库工作,所以我尝试直接使用代码

- (void)encodeObject:(id)object {
    [self push:object];
    [object encodeWithCoder:self];

    finalJSONObject = [NSDictionary dictionaryWithObject:[self topObject] forKey:[[[object class] description] camelcaseString]];

    [self pop];
}

我认为
jsonecoder
主要用于对自定义类中的对象进行编码(自定义类必须实现
NSCoding
协议)。例如,如果使用字符串属性定义类
Person

@interface Person : NSObject <NSCoding>
@property(strong, nonatomic) NSString *name;
@end

@implementation Person
- (id)initWithCoder:(NSCoder *)coder {
    if ((self = [super init])) {
        self.name = [coder decodeObjectForKey:@"name"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.name forKey:@"name"];
}
@end

它也有一些“普通”的基础类型,例如用<代码> NStOuts< /Cord>,但是输出不是很“好”,我不确定<代码> JSONEncoder <代码>是否会被这样使用:

JSONEncoder *encoder = [JSONEncoder encoder];
NSNumber *obj = @1234;
[encoder encodeObject:obj];
NSString *json = [encoder json];
NSLog(@"%@", json);
// Output: {"__NSCFNumber":{"NS.intval":1234}}
在这种情况下,内部调用
jsonecoder
encodeInt64:forKey:
方法

但是,正如您所注意到的,它不适用于
NSString

JSONEncoder *encoder = [JSONEncoder encoder];
NSString *obj = @"Hello world";
[encoder encodeObject:obj];
// Exception: *** -encodeBytes:length:forKey: only defined for abstract class.  Define -[JSONEncoder encodeBytes:length:forKey:]!
出现异常的原因是
NSString
NSCoding
兼容,但它使用编码器的
-encodeBytes:length:forKey:
,而
jsonecoder
不实现此方法

实现该方法并不太困难,这是一个快速而肮脏的尝试:

- (void)encodeBytes:(const uint8_t *)bytesp length:(NSUInteger)lenv forKey:(NSString *)key
{
    NSString *s = [[NSString alloc] initWithBytes:bytesp length:lenv encoding:NSUTF8StringEncoding];
    [self setObject:s forKey:key];
}
如果将此代码添加到“jsonecoder.m”,则可以对普通的
NSString
进行编码,而不会出现异常,结果如下所示:

{"__NSCFConstantString":{"NS.bytes":"Hello world"}}

但是,我也不确定
jsonecoder
是否应该这样使用。

该博客提到了该方法,但没有给出示例代码。@AaronBratcher:也许你应该展示你的类的定义以及你迄今为止所做的尝试。帮助解决具体问题更容易。NSString与NSCoder兼容。。。我们需要查看您的代码,因为错误消息听起来像是您正在向JSONECODER实例发送
encodeObject:
。我愿意尝试一下。我想你没有相反的办法把绳子拿回来吗?@AaronBratcher:我又想了一次。根据“JSON文本是一个序列化对象或数组”,对象是一个集合名称/值对。换句话说,顶级JSON对象始终是字典或数组。因此,将单个字符串编码为JSON没有多大意义。我认为您应该将字符串包装到自定义类中并对其进行编码。-顺便说一句,你为什么需要JSONECODER呢?NSDictionary和NSArray可以使用内置的NSJSONSerialization类进行编码。字符串应按以下方式编码为对象:variableName:value。与使用JSONECODER编码的其他类型非常相似。我希望接收JSON并将其发送到我的服务器,并将其直接解析到自定义类中或从自定义类中解析出来。@AaronBratcher:但是带有字符串属性的自定义类似乎可以工作(请参见我回答中的
Person
示例)。也许我还不明白你的问题。也许您可以显示自定义类的定义。看看所有这些,我想我只需要添加一个特定的encodeString方法。我希望在这个过程中了解编码字节。
{"__NSCFConstantString":{"NS.bytes":"Hello world"}}