小编Tod*_*man的帖子

ARC和桥接演员

有了ARC,我不能再投CGColorRefid.我了解到我需要做一个桥接演员.据clang docs说:

一个桥接投是C样式转换标注有三个关键字之一:

(__bridge T) op将操作数强制转换为目标类型T.如果T 是可保留对象指针类型,则op必须具有不可保留的指针类型.如果T是不可保留的指针类型,则op必须具有可保留的对象指针类型.否则演员阵容不合理.没有所有权转让,ARC不会保留任何保留操作.

(__bridge_retained T) op将必须具有可保留对象指针类型的操作数强制转换为目标类型,该目标类型必须是不可保留的指针类型.ARC保留该值,取决于对本地值的通常优化,并且接收方负责平衡+1.

(__bridge_transfer T) op将操作数(必须具有不可保留的指针类型)强制转换为目标类型,该目标类型必须是可保留的对象指针类型.ARC将在封闭的完整表达式的末尾释放值,这取决于对本地值的通常优化.

为了将对象传入和传出ARC控制,需要这些演员表; 请参阅有关可保留对象指针转换一节的基本原理.

纯粹使用__bridge_retained__bridge_transfer铸造来说服ARC分别发出不平衡的保留或释放,这种形式很差.

我会在什么样的情况下使用它们?

例如,CAGradientLayer有一个colors接受CGColorRefs 数组的属性.我的猜测是我应该__brige在这里使用,但究竟为什么我应该(或不应该)不清楚.

objective-c type-conversion clang automatic-ref-counting

165
推荐指数
3
解决办法
8万
查看次数

整数上的无分支条件 - 速度快,但它们可以更快吗?

我一直在尝试以下内容,并注意到这里定义的无分支"if"(现在有&-!!替换*!!)可以使用clang在64位Intel目标上加速某些瓶颈代码(几乎)2倍:

// Produces x if f is true, else 0 if f is false.
#define  BRANCHLESS_IF(f,x)          ((x) & -((typeof(x))!!(f)))

// Produces x if f is true, else y if f is false.
#define  BRANCHLESS_IF_ELSE(f,x,y)  (((x) & -((typeof(x))!!(f))) | \
                                     ((y) & -((typeof(y)) !(f))))
Run Code Online (Sandbox Code Playgroud)

请注意,f应该是一个没有副作用的相当简单的表达式,以便编译器能够进行最佳的优化.

性能高度依赖于CPU和编译器.clang的无分支'if'表现非常出色; 我还没有找到任何无分支的'if/else'更快的情况.

我的问题是:这些是安全的,可移植的吗(意味着可以保证在所有目标上得到正确的结果),并且可以更快地制作吗?

无分支if/else的示例用法

这些计算64位最小值和最大值.

inline uint64_t uint64_min(uint64_t a, uint64_t b)
{
  return BRANCHLESS_IF_ELSE((a <= b), a, b);
}

inline uint64_t uint64_max(uint64_t a, uint64_t b)
{
  return BRANCHLESS_IF_ELSE((a >= b), …
Run Code Online (Sandbox Code Playgroud)

c macros conditional-statements branch-prediction c11

16
推荐指数
1
解决办法
885
查看次数

为什么UIFont和CGFont/CTFont完全分开?

我试图用下载的字体绘制一些文本.我查看了API文档并搜索了Web.我找到了一个解决方案,但问题是它只适用于CoreGraphics级别框架.所以我搜索了一种转换CGFont方式UIFont,但没有办法做到这一点.

我意识到UIFontCGFont/CTFont完全分开,即使它们是从相同的字体文件创建的.CGFont并且CTFont可以相互转换,但是UIFont,唯一的方法是使用名称和大小等属性进行重新创建.适用的代码也是分开的.

例如,CATextLayer只接受CGFont/ CTFont- 否UIFont.但是所有UIKit控件都只接受UIFont.

为什么存在这种分离?还是我错了?(在UIKit课程中使用下载字体的任何方式?)

uikit uifont ios

14
推荐指数
1
解决办法
3699
查看次数

直接按升序计算数字因子而不进行排序?

是否有一种有效的算法来按升序排列数n的因子而不进行排序?"有效"我的意思是:

  1. 该算法通过从n的素数幂分解开始,避免了对除数的强力搜索.

  2. 算法的运行时复杂度为O(d log 2 d)或更好,其中dn的除数.

  3. 算法的空间复杂度为O(d).

  4. 该算法避免了排序操作.也就是说,这些因素是按顺序生成的,而不是按顺序生成并随后排序.尽管使用简单的递归方法进行枚举然后排序是O(d log 2 d),但是对于排序中涉及的所有存储器访问来说,存在非常难看的成本.

一个简单的例子是n = 360 =2³×3²×5,其中d = 24个因子:{1,2,3,4,5,6,8,9,10,12,15,18,20,24, 30,36,40,45,60,72,90,120,180,360}.

一个更严重的例子是n = 278282512406132373381723386382308832000 =2⁸×3⁴×5³×7²×11²×13²×17×19×23×29×31×37×41×43×47×53×59×61×67×71×73 ×79,其中d = 318504960因子(显然这里列出太多了!).顺便提一下,这个数字具有最大数量的因子,最多可达2 ^ 128.

我可以发誓几周前我看到了这种算法的描述,带有示例代码,但现在我似乎无法在任何地方找到它.它使用了一些魔术技巧,在每个素数因子的输出列表中维护一个祖先索引列表.(更新:我使用汉明数字混淆因子生成,其运算方式类似.)

更新

我最终在运行时使用O(d)的解决方案,具有极低的内存开销,可以就地创建O(d)输出,并且比我所知的任何其他方法都要快得多.我已经发布了这个解决方案作为答案,使用C源代码.它是另一个贡献者Will Ness在Haskell中提供的一个优化算法的优化简化版本.我选择了Will的答案作为公认的答案,因为它提供了一个非常优雅的解决方案,符合最初规定的所有要求.

algorithm primes enumeration factors

14
推荐指数
3
解决办法
2247
查看次数

如何使用AVAudioPlayer更快地播放音频*和*更高音调?

问题陈述:

我在我的应用程序中收集了一些声音效果,存储为.m4a文件(AAC格式,48 KHz,16位),我想以各种速度和音高播放,而不必将所有变体预先生成为单独的文件.

虽然对象的.rate属性AVAudioPlayer可以改变播放速度,但它始终保持原始音高,这不是我想要的.相反,我只是想要更快或更慢地播放声音样本并让音调上下移动以匹配 - 就像加速或减慢老式卷轴到磁带录音机一样.换句话说,我需要一些方法来基本上改变音频采样率,如+2半音(快12%),-5半音(慢33%),+ 12半音(快2倍)等.

题:

是否有某种方法从AVAudioPlayer对象中获取线性PCM音频数据,使用不同的iOS框架应用采样率转换,并将生成的音频数据填充到新AVAudioPlayer对象中,然后可以正常播放?

可能的途径:

我正在读书AudioConverterConvertComplexBuffer.特别是kAudioConverterSampleRateConverterComplexity_Mastering,并且kAudioConverterQuality_Max,AudioConverterFillComplexBuffer()引起了我的注意.所以这个音频转换框架看起来很可能.这是一条我应该进一步探讨的途径吗?

要求:

  1. 我实际上不需要立即开始播放.如果采样率转换引起轻微延迟,那很好.我所有的样本都是4秒或更短的时间,所以我认为任何即时重新采样都会很快发生,大约为1/10秒或更短.(不过,超过1/2会是太多了.)

  2. 如果有一种更简单的方法可以使用iOS提供的转换框架,我真的不想进入像OpenAL或Core Audio这样的重量级东西.但是,如果使用OpenAL或Core Audio 有一个简单的解决方案,我很乐意考虑这一点."简单"是指可以在50-100行代码中实现的东西,并且不需要启动额外的线程来将数据提供给声音设备.我宁愿把所有事情都自动解决 - 这就是为什么我愿意在播放前转换音频片段.

  3. 我想在这里避免使用任何第三方库,因为这不是火箭科学,我知道必须以某种方式使用原生iOS框架.

  4. 同样,我需要一起调整音高和播放速率,而不是单独调整.因此,如果播放速度减慢了2倍,那么人声会变得非常深沉且说话速度慢.如果播放速度加快2-3倍,那么人类的声音听起来就像一个快速说话的花栗鼠.换句话说,我绝对不希望在保持音频持续时间相同的同时改变音调,因为当向上弯曲音调超过一对半音时,该操作导致不期望的"细小"声音.我只是想加快整个过程,让音调上升为一种自然的副作用,就像过去的老式录音机一样.

  5. 需要在iOS 6及更高版本中工作,尽管iOS 5支持将是一个不错的奖励.

openal objective-c core-audio avaudioplayer ios

8
推荐指数
1
解决办法
2137
查看次数

什么是无限无量纲四叉树?

二维空间索引问题:

你称之为基本上是无限*四叉树的数据结构,其节点既不包含绝对坐标也不包含绝对尺度 - 其中每个节点的坐标系已经标准化为单位平方(0,0) - (1,1 ),顶级节点绝对没有固定?

当然,这是一个四叉树 - 但它是什么类型的四叉树?(有一个共同的名称吗?我已经看到了文献中命名和定义的几十种类型的四叉树,但不是这个特别的.

要渲染场景,您将获得一些起始节点(不一定是根),其大小(以像素为单位)以及它在屏幕上的位置.然后,您可以通过使用当前变换矩阵缩放其坐标来绘制节点内的所有对象,当您向下移动树时,您可以将其推入堆栈并减半.因此,节点的绝对坐标仅在渲染期间通过临时工作变量可用,并且不包含在数据结构本身内.

如果节点内的对象移动到节点之外(例如,在单位方块外),则将其传递给父节点以重新分配给另一个节点.如果对象变得碎片化(例如,子弹击中小行星),则较小的部分向下传递给子节点,子节点必须适当地缩放坐标以维持每个节点内的单位平方归一化.

与空间索引中使用的传统四叉树实现的关键区别在于,对象的坐标始终相对于包含它们的节点的坐标系.这种相对主义不仅适用于立场,也适用于规模.

*缺乏绝对坐标的无限; 甚至双精度浮点坐标在用于绝对定位时也会限制位置和尺寸.

2d quadtree recursive-datastructures coordinates spatial-index

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

Objective-C中类的内存大小

我很想知道内存的大小,分配一些Objective-C对象.

例如 :

[NSString stringWithString:@"2"]大于[NSNumber numberWithInt:2]还是不大?

和是多少更大的[NSNumber numberWithInt:2]int num=2

Apple是否有关于此问题的一些文档?我认为这些信息对于内存优化非常重要.

iphone memory-management ios

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

NSAssert的标准宏包装器(false,...)?

我写的大多数断言都是基于条件表达式,如下所示:

  • NSParameterAssert(key!= nil);
  • NSAssert(count <= MAX_FACTOR_COUNT,@"太多因素");
  • NSAssert1(大小%2 == 1,@"无法创建具有偶数大小%i的六边形板",大小);

但是我也有很多用硬编码的值触发断言失败的情况:

  • NSAssert(false,@"调用抽象方法");
  • NSAssert(false,@"未实现");
  • NSAssert(false,@"此子类的无效操作");

这对我来说不合适.我觉得我应该这样说:

  • NSAssertFail(@"调用抽象方法");
  • NSAssertFail(@ "未实现");
  • NSAssertFail(@"此子类的无效操作");

我的问题是:人们传统上如何处理这个问题?你怎么命名包装的预处理器宏NSAssert(false, ...)

NSAssertFail()一个好名字?

assert objective-c foundation

5
推荐指数
0
解决办法
608
查看次数

为什么`__builtin _ {{s,u} {add,sub,mul} ll_overflow`给出一个`long int`结果而不是`long long int`结果?

int溢出检查的版本加/减/乘在GCC内建命令返回一个int结果(良好),以及long int版本返回一个long int结果(也不错),但该long long int版本的返回long int结果(不好).为什么是这样?这对我来说似乎很疯狂.

例:

bool __builtin_uadd_overflow (unsigned int a, unsigned int b, unsigned int *res)
bool __builtin_uaddl_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
bool __builtin_uaddll_overflow (unsigned long long int a, unsigned long long int b, unsigned long int *res)
Run Code Online (Sandbox Code Playgroud)

这太破碎了,我甚至不敢相信.这意味着,在目标上,其中longlong long具有不同的尺寸(例如,32位的ARM的iOS目标),所述ll的功能版本是完全无用的.

c gcc clang

5
推荐指数
1
解决办法
626
查看次数