我有一些核心数据功能正常工作,直到最近(看似无关)一些更改.现在我遇到的问题是属于特定NSManagedObject子类实例的所有属性突然返回nil.
假设我的NSManagedObject子类名为Foo,它只有一个名为value的属性.一旦我意识到价值以某种方式变为零,我去设置以下类别来监控价值变化.
@implementation Foo (Debug)
- (void)setValue:(NSDate *)value
{
[self willChangeValueForKey:@"value"];
[self setPrimitiveValue:value forKey:@"value"];
[self didChangeValueForKey:@"value"];
}
- (NSDate *)value
{
[self willAccessValueForKey:@"value"];
NSDate *value = [self primitiveValueForKey:@"value"];
[self didAccessValueForKey:@"value"];
return value;
}
@end
Run Code Online (Sandbox Code Playgroud)
setValue:为我的对象调用,传入的参数是一个非零NSDate.然后检索该值(在另一种方法中).正确检索指定的相同值.
但是,当另一个方法尝试读取值时,将调用值访问器并由primitiveValueForKey:返回nil值.
在两个读取之间,setValue:未被调用,并且Foo对象本身仍然有效(非零).事实上,在任何Core Data对象或整个上下文的两次读取之间不会执行其他Core Data操作.
我们在项目中使用ARC.有可能ARC在某种程度上搞乱了我的核心数据变量并取消分配它们吗?如果是这样,有人有任何调试ARC解除分配的建议吗?或者更好的是,有没有人知道确保ARC不释放我的变量的方法.
这甚至可能与ARC无关,但是对于发生的事情我有点不知所措.任何建议将非常感谢.
我有一个应用程序,我正在努力,我刚开始使用iOS 5.我想开始使用自动引用计数,但我不知道我需要采取什么步骤才能迁移到iOS 5或至少打开ARC.
奇怪的是,在Big Nerd Ranch iOS 5书(第73页)和编程iOS 5书(O'Reilly,第314页)(updadte:甚至Kochan的Objective-C第四版),在ARC的背景下,他们比如属性的默认属性是assign......但是Apple的文档说默认是strong.
我还尝试了一个简单的程序,如果我没有指定strong,程序工作正常,如果我指定strong,它的工作方式相同,而当assign使用时,编译器显示警告,所以看起来默认是确实如此strong.
因此,如果大多数时间,我们想要
@property (nonatomic, readwrite, strong) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)
然后我们就可以写了
@property (nonatomic) NSMutableArray *foo;
Run Code Online (Sandbox Code Playgroud)
因为其他两个(readwrite和strong)是默认的?
我有一个dispatch_once用于创建静态对象的类方法.在dispatch_once我使用的块内,[self class]并想知道我是否需要使用弱引用self来避免保留周期?
+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
names = [[[self class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用弱引用,self我会收到警告:
+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
__weak TUAccount *wself = self;
dispatch_once(&predicate, ^{
names = [[[wself class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}
Run Code Online (Sandbox Code Playgroud)
不兼容的指针类型使用类型为'const Class'的表达式初始化'TUAccount*__ weak'
因为我收到警告,我认为self在这种情况下我不需要使用弱引用,但我想看看你们的想法.
cocoa weak-references objective-c objective-c-blocks automatic-ref-counting
因为我的应用程序使用ARC,我在Facebook的SDK中遇到了各种构建错误.我尝试从编译器中删除Facebook文件以避免这种情况,但是当我删除Facebook.m文件时出现Apple Mach-O错误.如果我把它放回编译源中,我会收到ARC错误.
有人碰到这个吗?
对于iOS应用程序,使用ARC,我们通常会发布这些viewDidUnload吗?
将所有实例变量设置为 nil
将所有属性设置为 nil
使用CGContextRelease,CGImage with CGImageRelease和color space 释放任何上下文CGColorSpaceRelease(释放任何非对象)
需要没有特别关注NSMutableArray的NSSet要素:刚才设置的参考NSMutableArray中和的NSSet为零,每个元素会自动释放.
这样做会处理ARC下的大部分内存释放吗?是否还需要发布其他项目?
在将应用转换为使用自动引用计数时,我遇到了以下错误:
SCNetworkReachabilityContext context = {0, self, NULL, NULL, NULL};
Run Code Online (Sandbox Code Playgroud)
使用ARC不允许将Objective-C指针隐式转换为'void*'
这可以修复编译器错误,但会发出警告:
SCNetworkReachabilityContext context = {0, objc_unretainedPointer(self), NULL, NULL, NULL};
Run Code Online (Sandbox Code Playgroud)
如何摆脱这种警告?
使用类型'objc_objectptr_t'(又名'const void*')的表达式初始化'void*'会丢弃限定符
我想写这样的东西:
@interface Foo{
__strong id idArray[];
}
@end
Run Code Online (Sandbox Code Playgroud)
但是编译器抱怨它:
Field has incomplete type '__strong id []'.
Run Code Online (Sandbox Code Playgroud)
如何在ARC下创建id数组成员实例?我如何初始化该数组?使用malloc?新[]?
我不想使用NSArray,因为我正在将一个大型库转换为ARC,这将导致很多工作.
我有一些内部块的操作.此操作,只更新UIImage如下:
^(UIImage *image) {
self.myImage = image;
}];
Run Code Online (Sandbox Code Playgroud)
我的图像是通过访问互联网计算的NSURLConnection.当我从互联网上收到图像时,我称之为内部的那个块NSMutableArray.到现在为止还挺好.我的问题是,当我有多个具有相同URL的图像,而不是进行多次调用时,我只是NSMutableArray在处理连接的类内部添加一个新块.这样,我进行一次调用,并更新共享URL的多个图像.一切正常,问题是我在泄漏块.我将这样的块添加到NSMutableArray:
if( (self = [super init]) )
{
self.connectionURL=url;
self.arrayOfBlocks=[NSMutableArray array];
[arrayOfBlocks addObject:completion];
}
return self;
Run Code Online (Sandbox Code Playgroud)
这是初始化连接类的时候.这是我需要添加一个新块NSMutableArray(我只添加它,就是这样):
[arrayOfBlocks addObject:completion];
Run Code Online (Sandbox Code Playgroud)
这是当我最终收到回调并开始执行块时:
for (MyBlock blockToExecute in arrayOfBlocks)
{
blockToExecute([UIImage imageWithData:data]);
}
Run Code Online (Sandbox Code Playgroud)
问题是,这是以某种方式泄漏.我无法抵消使用版本或自动发布,因为我在ARC环境中.那么什么可以解决方案呢?

nsurlconnection ios objective-c-blocks automatic-ref-counting
除了通过第三方代码强行进入项目之外,我还没有使用过ARC.我已经阅读了所有ARC文档,但没有看到这个问题的答案:
如果我有一个在编译的模块中定义的类,-fobjc-arc我可以在一个未启用ARC的模块中从中派生一个新类吗?
在我看来,只要派生类不试图触及根类中的任何ivars,它应该可以正常工作.在我看来,即使有一个dealloc方法调用[super dealloc]在派生类中也没问题.
那么,另一种方式呢?我可以从非ARC类派生一个启用ARC的类吗?应该也可以正常工作,对吧?
加分点:在混合使用ARC和非ARC代码时,有什么问题我应该让自己知道吗?