升级到Objective-C ARC(自动引用计数)后,我的代码不再编译并给我这些奇怪的错误:
/Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m
1. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:52:1: current parser token '-'
2. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:1: LLVM IR generation of declaration 'PurchaseThemeOptionVC::viewDidLoad'
3. /Users/teacher/drawingapp/Main/Source/PurchaseThemeOptionVC.m:39:21: LLVM IR generation of compound statement ('{}')
clang: error: unable to execute command: Segmentation fault
clang: error: clang frontend command failed due to signal 2 (use -v to see invocation)
我已经多次查看了源文件,但我看不出它有什么问题.
这些错误意味着什么?
我想知道如何释放一个强大的财产.我想澄清为什么我打算这样做.我通过这个属性声明拥有一个对象:
@interface MyClass : NSObject {
__strong MyObject *myHeavyObject;
}
@end
Run Code Online (Sandbox Code Playgroud)
我在某种方法中创建了这个对象,我在另一个方法中使用它,依此类推.
- (void)someMethod {
myHeavyObject = [[MyObject alloc] init];
...
}
- (void)someOtherMethod {
id response = [myHeavyObject getResponse];
}
Run Code Online (Sandbox Code Playgroud)
然而,在某些时候,我知道我不再需要它,因为它很重,我想摆脱它:
- (void)someCallDidFinish {
//i no longer need myHeavyObject...how do I get rid of it?
}
Run Code Online (Sandbox Code Playgroud)
我不想等到dealloc,因为那可能是很长一段时间.我知道我不再使用这个物体了,所以怎么能让它消失呢?如何在ARC范例中支持这一点?这是否合理要求?
英
我有一个带有属性的类,它是对块的弱引用.
@interface BlockTest : NSObject
@property (nonatomic, weak) void(^testBlock)();
@end
Run Code Online (Sandbox Code Playgroud)
在课程的另一点我使用这个块像这样:
- (void)foobar {
self.testBlock = ^{
[self doSomething];
};
}
Run Code Online (Sandbox Code Playgroud)
编译器(Apple LLVM 3.0)抱怨可能存在保留周期,因为self这里强烈捕获.但我没有看到它如何导致保留周期,因为块本身是一个__weak参考,所以应该没问题.如果我正确理解了ARC弱引用,那么当-foobar方法返回时,传递给的块self.testBlock应该被释放(如果没有保存在其他地方),因此也会释放self.
编译器仍然认为可能存在保留周期的原因是什么?
在启用ARC的项目中,是否有一种方法可以在-fno-objc-arc代码中以编程方式添加标记.
所以我可以将我的源文件提供给其他人,并且该人不需要-fno-objc-arc手动添加.
我使用ARC制作了一个iPhone应用程序,可以访问地址簿中的每个条目,然后是每个人的每个地址.数据存储在CFArrays中,CFArrays是免费的桥接到NSArrays.代码如下.
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSArray *peopleArray =[(__bridge NSArray *) arrayRef copy];
CFRelease(arrayRef);
arrayRef = nil;
for(id personId in peopleArray)
{
ABRecordRef person = (__bridge ABRecordRef) personId;
//process other attributes of the address book
ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonAddressProperty);
CFArrayRef addressRef = ABMultiValueCopyArrayOfAllValues(multi);
NSArray *addressArray = [(__bridge NSArray *) addressRef copy];
for(NSDictionary *address in addressArray)
{
//process the addresses
}
CFRelease(addressRef);
addressRef = nil;
}
Run Code Online (Sandbox Code Playgroud)
从我在互联网和Apple的内存管理指南中研究过,这看起来是正确的方法.问题是当我运行代码时,它停止在"CFRelease(addressRef)"上,突出显示绿色,文本"Thread 1"(不确定这个错误意味着什么).我也尝试在for循环之前放置CFRelease,但同样的问题也出现了.
如果我删除了CFRelease,它会编译,但是在创建addressArray时会出现内存泄漏.有谁知道如何解决这个问题?我似乎无法用ARC来解决这个问题.
我的iOS应用程序有点奇怪.一段时间后我的应用程序在内存中变低,因此内存警告,一切似乎都很好,但是当我检查内存使用情况时,我注意到所有对viewDidUnload的调用都没有释放大量内存,所以在我点击几下之后应用程序,它再次在内存警告,一切似乎再次正常,但没有很多内存已被释放,所以它再次在内存警告更快,然后它崩溃(大多数时间后第三个内存警告) .这个崩溃是随机的:应用程序冻结,应用程序离开,我的调试器说app暂停,但没有糟糕的访问或sigbort,没有僵尸.我的猜测是,内存警告无法释放足够的内存.
(我检查了所有viewDidUnload,并将每个在viewDidLoad中分配的对象设为nil)
任何帮助都会有用!
非常感谢.
如何将以下代码转换为ARC?
- (NSString *) shardId {
return [[__shardId retain] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
以下内容为我编译,但不确定是否存在任何潜在问题.
- (NSString *) shardId {
return __shardId;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的应用程序转换为ARC,但当我这样做时,它减慢了5倍:(
在我的图表视图中,我有这个代码块迭代所有点:
NSLog(@"%f", CACurrentMediaTime());
for (NSUInteger xIndex = firstXValueOnScreen; xIndex <= lastXValueOnScreen; xIndex++)
{
float value = 5; //This used to call a function to get the value but I took out the function call to better demonstrate that this seems to be just a general slowdown...
if (extremesUninitialized)
{
yMax = value;
yMin = value;
extremesUninitialized = NO;
}
else
{
yMax = MAX(yMax, v,alue);
yMin = MIN(yMin, value);
}
}
NSLog(@"%f", CACurrentMediaTime());
Run Code Online (Sandbox Code Playgroud)
在ARC之前,此块在大约0.01秒内执行.然后,我使用ARC转换器,它愉快地将我的代码转换为ARC而没有任何抱怨.在此之后,我在相同的情况下运行相同的代码,得到.05秒的结果!它的速度减慢了5倍...所以我从快照恢复了我的旧项目,所以不再使用ARC,并且进行了10次测试,并且始终得到了0.01秒的结果.然后我将它转换回ARC并持续获得.05秒.XCode没有给我任何关于为什么会发生这种情况的线索......但我的其余代码也在减速.会发生什么事?
在我听说了ARC功能以及如何减少处理内存之后,我已经转换了我的应用程序,它构建了动态表单但仍然在我从web服务进行同步(在CoreData上写入大量数据)时,有任何指南行应该应用它应用于ARC技术.我们的日志显示有一个(收到内存警告.等级= 1)
iphone memory-management core-data ios automatic-ref-counting
我正在考虑在我正在编写的库中使用异常进行内部错误处理.如果使用它们,库将使用arc构建并f-objc-arc-exceptions启用.
obj-c异常的一个问题是必须注意不要抛弃任何你不知道的异常安全的代码.编译文件时-fobjc-arc-exceptions,编译器异常添加的枚举代码是否安全?
据我所知,它应该是,因为我看不出有什么理由去做任何需要清理的事情.但如果在某处记录这种行为,我会更乐意使用它.
编辑:我应该澄清,当我说"使用异常进行内部错误处理"时,我说的是非致命错误.所以"异常安全"在这里意味着不应该有内存泄漏,没有未释放的锁等.
objective-c ×6
ios ×5
iphone ×3
cocoa ×2
autorelease ×1
core-data ×1
ios5 ×1
llvm ×1
macos ×1
memory ×1
memory-leaks ×1
retain ×1
xcode ×1
xcode4.2 ×1