Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
寻找更简单的Objective-C解决方案_Objective C - Fatal编程技术网

寻找更简单的Objective-C解决方案

寻找更简单的Objective-C解决方案,objective-c,Objective C,也许“简单”这个词不合适;简洁也可以。我很清楚Objective-C是一种冗长的语言;我只是想知道它是否必须像我在下面展示的解决方案那样冗长。我对这门语言比较陌生 这段代码根据生成的可变高度UITableViewCell(每个字段包含一个标签)统计记录中每种类型字段的数量。我的问题不是如何做到这一点——我已经弄明白了——我只是想知道:在Objective-C中,使用NSDictionary对象是否有一种更简单或更不冗长的方法来做到这一点?这是否像使用NSD字典一样简洁?也欢迎使用其他集合类型对象

也许“简单”这个词不合适;简洁也可以。我很清楚Objective-C是一种冗长的语言;我只是想知道它是否必须像我在下面展示的解决方案那样冗长。我对这门语言比较陌生

这段代码根据生成的可变高度UITableViewCell(每个字段包含一个标签)统计记录中每种类型字段的数量。我的问题不是如何做到这一点——我已经弄明白了——我只是想知道:在Objective-C中,使用NSDictionary对象是否有一种更简单或更不冗长的方法来做到这一点?这是否像使用NSD字典一样简洁?也欢迎使用其他集合类型对象的解决方案

这是我的-PartsRecord.countFields方法。我稍微简化了代码

-(NSDictionary*) countFields {  
NSDictionary* dict = [[NSDictionary alloc] initWithObjectAndKeys:  
     @"s", [NSNumber numberWithUnsignedInt: [self.struts count]],  
     @"h", [NSNumber numberWithUnsignedInt: [self.headAssemblies count]],  
     @"l", (self.leftVent == nil) ?   [NSNumber numberWithUnsignedInt: 0] :  
                                      [NSNumber numberWithUnsignedInt: 1],  
     @"r", (self.rightVent == nil) ?  [NSNumber numberWithUnsignedInt: 0] :  
                                      [NSNumber numberWithUnsignedInt: 1],  
     nil ];  
return dict;  
}

上述代码中的任何错误都是转录错误,而不是代码中的实际错误。
TIA,
霍华德


将其缩短2行

您还可以将
[[NSDictionary alloc]initWithObjectsAndKeys:][/code>更改为
[NSDictionary dictionary with objectsandkeys:][/code>


无论如何,这将是一个好主意,因为您的代码正在分配
NSDictionary
,而不释放它
-DictionaryWithObjects和Keys:
返回一个自动删除的字典。

-[NSNumber numberWithInt:0]
-[NSNumber numberWithUnsignedInt:0]
是相同的数字(事实上,在Cocoa的某些实现中,它们甚至可能是相同的对象)。

除非您打算键入数字,您的对象顺序错误。它应该是对象,然后是键

dict = [NSDictionary dictionaryWithObjectsAndKeys:
   [NSNumber numberWithUnsignedInt: [self.struts count]], @"s",
   [NSNumber numberWithUnsignedInt: [self.headAssemblies count]], @"h",
   [NSNumber numberWithUnsignedInt: self.leftVent  ? 1 : 0], @"l", 
   [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0], @"r",
   nil ];

这样,调用
[dict objectForKey:@“s”]
将返回
[self.struts count]
number对象。

它必须是字典吗?如果不是,也许使用一些简单的C更容易理解

typedef struct {
    unsigned strutCount;
    unsigned headAssembliesCount;
    BOOL leftVent;
    BOOL rightVent;
} Fields;


- (void) countFields:(Fields *) fields
{
    fields->strutCount = [self.struts count];
    fields->headAssembliesCount = [self.headAssemblies count];
    fields->leftVent = (self.leftVent != nil);
    fields->rightVent = (self.rightVent != nil);
}

我认为使用宏可以简化键入并提高可读性


…而且@Matt Ball是正确的,当返回对象时,它应该自动删除

更干净!谢谢这证明了,尽管在C/C++世界工作了3年左右,但总有比过去更好的风格变化。很好的提示和风格要点。(我喜欢三元运算符。)别忘了修复内存泄漏-这是比样式更重要的问题键可以是NSObject派生的对象,值也可以是NSObject派生的对象。关于我的顺序错误,你是对的:我在字符串上键入了键。@cobbal,任何符合NSCopying且哈希值在集合中为常量的对象都可以是键。因为它们只包含1或0,numberWithBool:可能更好。呃,只有一个“实现”可可苹果的。Cocoa是OpenStep的一个实现。我想这就是你的意思。不,不是。Cocoa框架在mac os x版本之间发生变化,只有一些版本(都实现了Cocoa API)缓存了常见的NSNumber实例。类似的宏名称属于Windows API;)伙计,那很痛,我是Mac!:)我不会说它属于Windows,只是它似乎属于原始C/C++。使用宏的最大缺点是可调试性。由于编译器将宏调用替换为#定义的文本,因此源代码和二进制代码不会对齐。我在我的时代写过一些非常粗糙的宏,我的经验法则是尽可能避免它们。我只在它们为我节省了大量工作、足够不言自明并且我可以煞费苦心地保证它们的正确性时才使用它们。即便如此,我还是重新考虑这是否真的是个好主意…:-)或者,return语句应该更改为“return[dict autorelease]”,这实际上是相同的,只是更详细。对。我只是选择了手动发布的变体,因为我在iPhone上,生成了1000个这样的东西。实际上,这提出了另一个问题。实际上,我正在用这个方法发布字典。从内存管理编程指南来看,“在给定的代码块中,使用复制、分配和保留的次数应该等于使用释放和自动释放的次数”return[dict autorelease];是首选方法吗?在这个方法中,你创建了数千个对象这一事实是不相关的——你必须返回一个自动删除的对象,正如Matt指出的,你发布的代码每次都会泄露字典。我也更喜欢从自动删除开始创建字典——我个人觉得它更简洁。如果返回自动释放的对象,则不希望在方法之外再次释放它。如果你在循环中调用这个方法很多,你可以考虑在循环中创建一个自动恢复池来更早地恢复内存。只是要知道有一个头顶打击。
typedef struct {
    unsigned strutCount;
    unsigned headAssembliesCount;
    BOOL leftVent;
    BOOL rightVent;
} Fields;


- (void) countFields:(Fields *) fields
{
    fields->strutCount = [self.struts count];
    fields->headAssembliesCount = [self.headAssemblies count];
    fields->leftVent = (self.leftVent != nil);
    fields->rightVent = (self.rightVent != nil);
}
#define SET_KEY_NUMBER( _key, _value ) \
  [NSNumber numberWithUnsignedInt:_value], _key
#define SET_KEY_BOOL( _key, _bool ) \
  [NSNumber numberWithUnsignedInt: (_bool) ? 1 : 0], _key

-(NSDictionary*) countFields {  
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      SET_KEY_NUMBER( @"s", [self.struts count] ),
      SET_KEY_NUMBER( @"h", [self.headAssemblies count] ),
      SET_KEY_BOOL(   @"l", self.leftVent == nil ),
      SET_KEY_BOOL(   @"r", self. rightVent == nil ),
      nil ];  
    return dict;
}