小编Fel*_*xyz的帖子

NSMutableData如何分配内存?

当我运行以下代码时,它会慢慢占用我的内存,甚至开始使用swap:

 long long length = 1024ull * 1024ull * 1024ull * 2ull; // 2 GB

 db = [NSMutableData dataWithLength:length];

 char *array = [db mutableBytes];

 for(long long i = 0; i < length - 1; i++) {
      array[i] = i % 256;
 }
Run Code Online (Sandbox Code Playgroud)

如果我在没有for循环的情况下运行它,则根本不使用内存:

 long long length = 1024ull * 1024ull * 1024ull * 2ull;
 db = [NSMutableData dataWithLength:length];
 char *array = [db mutableBytes];
 /* for(long long i = 0; i < length - 1; i++) {
      array[i] = i % …
Run Code Online (Sandbox Code Playgroud)

error-handling memory-management objective-c

4
推荐指数
1
解决办法
1035
查看次数

Clang:什么是"方法返回一个带有+0保留计数的Objective-C对象"试图告诉我?

在XCode 3.2和Nikita Zhuk的分析工具中使用clang运行静态分析我经常会遇到这样的警告:

方法返回一个带有+0保留计数的Objective-C对象(非拥有引用)

此时,调用者不拥有对象引用计数的不正确减量

可能引发此警告的代码示例:

UIButton* button = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame: CGRectMake(x, y, width, height)];
return button;
Run Code Online (Sandbox Code Playgroud)

我假设以这种方式创建的按钮是自动释放的,就像使用便利工厂方法创建的任何其他NSObject一样.所以我回复它,调用者可以决定是否保留它.有什么问题?

在返回之前,我是否有义务保留并自动释放对象?最重要的是,无论这个警告警告什么,都可能导致可怕的释放相关的崩溃?

我现在意识到这似乎只发生在UIButton上.是因为它是一个类集群吗?

编辑:下面的剪辑显示了一个最小的情况,其中clang发出这些警告(警告以粗体显示).在创建对象(buttonWithType:消息)的语句中标记两个警告.

-(UIButton*) ztupidTezt:(UIImage*) img
{
  UIButton* bt = [[UIButton buttonWithType:UIButtonTypeCustom]initWithFrame:
Run Code Online (Sandbox Code Playgroud)

1方法返回一个具有+0保留计数的Objective-C对象(非拥有引用)

2调用者此时不拥有对象引用计数的不正确减量

    CGRectMake(0.0f, 0.0f, img.size.width, img.size.height)];
    bt setImage:img forState:UIControlStateNormal];
    return bt;
}
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c clang clang-static-analyzer

3
推荐指数
2
解决办法
7094
查看次数

将Core Animation与CALayers以外的对象一起使用

我很确定我已经在网络上看过这个问题,但现在我似乎无法找到任何东西.问题很简单:有没有办法用来CABasicAnimation动画一个不是'CALayer'的对象的属性?(比如'AVAudioPlayer'上的'volume'属性.)

如果没有,除了子类化'CALayer'之外,有没有办法让它工作?也许某些协议符合?

编辑:在iPhone OS上这样做怎么样?

iphone cocoa cocoa-touch core-animation objective-c

2
推荐指数
1
解决办法
554
查看次数

App Store的本地化价格

我将同一家公司的其他应用程序链接到iPhone应用程序,我们希望显示这些应用程序的价格.是否有可能以某种方式获得适合用户的本地化价格字符串(金额和货币)?我想我不得不诉诸屏幕抓取之类的东西,但我已经看到人们可以从App Store获得相当多的信息,所以也许有一些相对简单的方法?

iphone cocoa-touch objective-c app-store

2
推荐指数
1
解决办法
1025
查看次数

编译器无法捕获条件块中的变量重定义

int bar = 2;
if (bar)
{
   int bar;
}
Run Code Online (Sandbox Code Playgroud)

gcc或Clang都没有设法为此发出警告(或错误),程序在启动时立即崩溃.有这么好的理由吗?看起来似乎并不难以捕捉到.这是块作用域的基础:嵌套作用域继承了封闭块的名称......

有什么解释吗?

编辑:事实证明崩溃是由于使用Clang.我来回测试了很多次,似乎可以确定变量重定义和Clang的组合会导致崩溃.但是,我无法在测试项目中重现崩溃,所以请参考.

问题结果与Objective-C相关.正如Jonathan Leffler所指出的那样,在内部范围内执行'int bar = bar'会从自身初始化变量,这就是导致问题的原因,当初始化是通过Objective-C方法调用完成的.

以下显示了操作中的错误:

-(void)crasher
{
   NSNumber* bar = [NSNumber numberWithInt:2];
   if (bar)
   {
      NSString* bar = [self doit:bar];
   }
}

-(NSString*)doit:(NSNumber*)num
{
   NSString* str = [num stringValue];   // This line causes the crash
   return str;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在纯C中执行类似的操作不会导致崩溃:

int bar = 2;
if (bar)
{
   char buff[10];
   int bar = sprintf(buff, "%d",bar);       
}
Run Code Online (Sandbox Code Playgroud)

c compiler-construction gcc objective-c llvm

2
推荐指数
1
解决办法
483
查看次数

目标中的内存管理-c

我在我的一个课程中有这个代码:

- (void) processArray
{

   NSMutableArray* array = [self getArray];
   . . .
   [array release];
   array  = nil;
}


- (NSMutableArray*) getArray
{
   //NO 1:
   NSMutableArray* array = [[NSMutableArray alloc]init];

   //NO 2:
   NSMutableArray* array = [NSMutableArray array];
   . . .
   return array;
}
Run Code Online (Sandbox Code Playgroud)

NO 1:我创建一个数组并将其返回.在processArray方法中我释放它.

NO 2:我通过简单地打电话得到一个数组array.因为我不是这个的拥有者,所以我不需要在processArray方法中释放它.

哪个是最佳选择,NO 1还是NO 2?或者有更好的解决方案吗?

iphone memory-management objective-c

2
推荐指数
1
解决办法
313
查看次数

卡布奇诺(目标-j)/阿特拉斯是如何将相对和绝对定位排除在外?

我最近一直在查看卡布奇诺和阿特拉斯,他们似乎已经将相对和绝对的定位抽象为"有效"的东西.我想知道那些熟悉这个项目的人 - 他们是怎么做到的?

我一直认为相对和绝对定位是一种思考定位元素的模糊方式,所以我对此非常好奇.

我可以查看的任何帮助或资源都很棒!

abstraction cappuccino positioning atlas

2
推荐指数
1
解决办法
292
查看次数

宏中的注释行

请帮助宏初学者...我创建了一个简单的宏来加载图像并将其分成几行,这样我就可以在每次执行从宏生成的代码时进行记录(用于调试).它看起来像这样:

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \
PngImageClass* __tmp; \
printf("Loading png: %s", L_I_IMAGE_NAME);\
__tmp = [image loading code here];\
__tmp; \
})
Run Code Online (Sandbox Code Playgroud)

我的计划是能够在需要时轻松地注释日志行(手动),但预处理器不会容忍任何正常方式.应该怎么做?!

编辑:我完全错误的说它不能正常工作"任何正常的方式",因为我一直懒得只尝试单行注释.我还会听取几个响应者的意见,将其变成一个功能.不,没有充分的理由(我猜)为此使用宏.

c macros objective-c

0
推荐指数
1
解决办法
185
查看次数