我使用以下代码迭代对象的所有属性.我成功地检索property name的char,但我不知道如何得到property value它的id类型.有关如何实现这一目标的任何想法?
objc_property_t *allProperties = class_copyPropertyList([currentObject class], &allPropertyCount);
for (unsigned int i = 0; i < allPropertyCount; i++) {
objc_property_t property = allProperties[i];
const char * propertyName = property_getName(property);
}
Run Code Online (Sandbox Code Playgroud)
================================================== ======================================
编辑:谢谢大家的好评和答案.有些人问我为什么需要这个.嗯,原因如下:
我有几个同类的对象.让我们说这个类是Person,它的实例是玛丽,约翰和大卫.每个对象的属性设置如下:
mary.age = [NSNumber numberWithInt:20];
john.age = [NSNumber numberWithInt:45];
david.age = [NSNumber numberWithInt:20];
mary.gender = @"female";
john.gender = @"male";
david.gender = @"male";
Run Code Online (Sandbox Code Playgroud)
我的目的是找到一种基于给定属性名称Eg对对象进行分组的通用方法.这将创建2组[大卫和玛丽]和[约翰]:
[self groupBaseDataObjects:self.persons withPropertyName:"age"];
Run Code Online (Sandbox Code Playgroud)
还有这个:
[self groupBaseDataObjects:self.persons withPropertyName:"gender"];
Run Code Online (Sandbox Code Playgroud)
还将创建2组[约翰和大卫]和[玛丽]
好吧,所以最近我得到了这个可能的坏习惯,用@property创建getter和setter 声明我的类属性,@synthesize并且只需在我需要它的地方使用它们就像self.name没有引用内部ivar(让它@synthesize的工作)
现在,当然这不允许我访问内部的ivar(例如.name_)但是从我到目前为止编写的内容来看,我并不是真的需要它.对于只读属性,我不使用,@synthesize而是自己实现getter.
一切似乎都很好,但不知怎的,我觉得这是不对的,因为我已经查看了所有的开源库,也宣告了ivar并在整个代码中使用它.@property+ @synthesize并且没有ivar它绝对是懒惰的选择,但有什么缺点?有人可以给我一些建议吗?
另外,我已经读过,作为一般建议,self.propertyName除了dealloc和init方法之外,可以在类代码中的任何地方使用它.但只要你确保对象是初始化的:
-(id) init
{
if( (self=[super init] )) {
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
并且在调用之前删除所有键值观察器[super dealloc]应该没问题.对?
一个简单的问题,但我无法找到它的解决方案:
我有2个UIViews,在同一个父视图中一个在另一个之上.两者都有GestureRecognizers,但只有最顶级的是接收事件.如何让最顶层的视图通过他获取到其下面的其他UIViews的所有手势?
我最近看到一些用于instantiateWithOwner以UITableView这种方式加载单元格的代码示例:
cell = [nib instantiateWithOwner:self options:nil][0];
虽然它比将属性出口作为原型单元更清晰,更紧凑,但我想知道它是否有保证(也就是文档化)接口构建器中的第一个顶级对象将始终是返回的数组中的第一个instantiateWithOwner.此时可能就是这种情况,但如果没有记录(未定义),它可能会在将来发生变化,从而导致具有多个顶级对象的nib会出现问题并实例化此类单元格.
我有一些代码使用缓冲区移动字节memmove().缓冲区由多个线程访问.我得到一个非常奇怪的行为; 有时缓冲区不应该是它应该是什么,我在想是否memmove()和/和malloc()线程安全.我在iOS上工作(如果这是依赖于平台的).
我想找到一种格式化NSString的方法,如下所示:
Name: John
Location: Unknown
Type: Unknown
Status: Unknown
Run Code Online (Sandbox Code Playgroud)
现在我正在使用此代码执行此操作,但结果完全不同:
代码:
serializedValue = [serializedValue stringByAppendingFormat:@"%@:\t\t%@\n",title, value];
Run Code Online (Sandbox Code Playgroud)
title左栏在哪里,value是第二栏.
结果:
Name: John
Location: Unknown
Type: Unknown
Status: Unknown
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,在我的情况下,总是添加常量数量的选项卡(\ t),2不会有效,因为左列中的某些单词较长而有些单词较短.我想知道是否有一种简单的方法可以做到这一点,我不知道.
我想知道,如果我有一个需要同步的对象并且它存在于代码块中的几个(2-3)位置,那么将@synchronized添加到整个块或者在每个对象之前是否更好(更快)发生?
@synchronized (someObj) {
[someObj removeAllObjects];
}
..
@synchronized (someObj) {
[someObj addObject:[NSNumber numberWithInt:203]];
}
Run Code Online (Sandbox Code Playgroud)
VS
@synchronized (someObj) {
[someObj removeAllObjects];
... (potential a large block of code)
[someObj addObject:[NSNumber numberWithInt:203]];
... (potential a large block of code)
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我有一个范围从30到300的值数组。我想以某种方式得出一个加权平均值,如果我有5个值并且其中一个值比其余值大很多(峰值),则不会对平均值产生太大影响因为它会如果我只是做一个算术平均:例如:(n1+n2+n3+n4+n5)/5。
有谁知道如何制作一个可以做到这一点的简单算法,或者在哪里看?
我在远程机器上有一个目录,我的客户端正在上传(通过不同的工具和协议,从WebDav到FTP)文件.我还有一个返回目录结构的PHP脚本.现在,问题是,如果客户端上传大文件,并且我在上传期间发出请求,PHP脚本将返回该文件,即使它没有完全上传.有没有办法检查文件是否使用PHP完全上传?