如果我宣布一个强大的财产,如下:
@property (strong, nonatomic) UIView *iVar;
Run Code Online (Sandbox Code Playgroud)
当我设置它,它的问题,如果我做的iVar = ...还是self.iVar = ...?似乎用ARC,他们做同样的事情.
如果我只声明实例变量(不是@property),例如,BOOL selected那是否意味着它被推断为__unsafe_unretained(因为没有指定它强的属性),或者我必须明确指定它吗?
在回答ARC时,我似乎已经回答了我自己的问题:如何释放静态变量?,但我仍然对上述问题略感困惑.
我需要在iOS应用程序中创建一个假va_list的传递给NSString initWithFormat:arguments:函数,这是我的代码:
NSArray *fixedArguments = [[NSArray alloc] initWithArray:arguments];
NSRange range = NSMakeRange(0, [fixedArguments count]);
va_list fakeArgList = (va_list)malloc(sizeof(NSString *) * [fixedArguments count]);
__unsafe_unretained id *ptr = (__unsafe_unretained id *)fakeArgList;
[fixedArguments getObjects:ptr range:range];
content = [[NSString alloc] initWithFormat:outputFormat
arguments:(va_list)fakeArgList];
free(fakeArgList);
Run Code Online (Sandbox Code Playgroud)
编译器在转换线上抱怨此消息:
error: cast of a non-Objective-C pointer type 'va_list' (aka 'char *') to '__unsafe_unretained id *' is disallowed with ARC
Run Code Online (Sandbox Code Playgroud)
该getObjects:range:功能定义如下:
- (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切,但仍然无法摆脱这个错误......
是否有va_list启用ARC 创建假的解决方案?我究竟做错了什么?
有没有人设法在arc下使用objc_getClassList,而不是为有问题的文件关闭弧线?
基本问题是其中一个参数是一个C类的Class指针.
我有点困惑为什么clang为以下两种方法发出不同的代码:
@interface ClassA : NSObject
@end
@implementation ClassA
+ (ClassA*)giveMeAnObject1 {
return [[ClassA alloc] init];
}
+ (id)giveMeAnObject2 {
return [[ClassA alloc] init];
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我们查看发出的ARMv7,那么我们会在O3启用ARC的情况下看到这个:
.align 2
.code 16
.thumb_func "+[ClassA giveMeAnObject1]"
"+[ClassA giveMeAnObject1]":
push {r7, lr}
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0+4))
mov r7, sp
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0+4))
movw r0, :lower16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1+4))
movt r0, :upper16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1+4))
LPC0_0:
add r1, pc
LPC0_1:
add r0, pc
ldr r1, [r1]
ldr r0, [r0]
blx _objc_msgSend
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC0_2+4))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC0_2+4))
LPC0_2:
add r1, …Run Code Online (Sandbox Code Playgroud) 考虑这个例子:
- (void)doSomething {
@autoreleasepool {
if (someCondition) {
/* ... allocate some autoreleased objects here ... */
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
以前,使用手动NSAutoreleasePools,如果我们提前返回,我们需要打电话[pool drain],否则池不会被耗尽.随着新的@autoreleasepool {}
我正在升级iOS 4项目,将其与ARC一起用于sdk5.所以我想使用自动重构方法将代码转换为使用ARC.不幸的是它不起作用.我收到很多错误..
for(id* child in childObjectArray){
[child removeParentGroupReferences];
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误输出:
指向非const类型"id"的指针,没有明确的所有权
对此有何帮助?我需要改变什么?谢谢你的帮助..
这是我第一次摆弄iOS5和ARC.到目前为止,这么好,它有效,但我遇到了某种问题.
我有一个自定义UIStoryboardSegue,我使用Facebook Connect(或其他服务)将用户登录到我的应用程序.简而言之,它应该做到以下几点:
相反,是登录开始,但是在有机会完成之前,ARC会立即释放segue.
我想到了一个快速的黑客来阻止这个:
@interface BSLoginSegue() {
__strong BSLoginSegue *_retained_self;
}
@end
// Stuff...
// Other stuff...
- (void) perform {
login();
_retained_self = self;
}
- (void) loginServiceDidSucceed:(BSLoginService *)svc {
...
_retained_self = nil;
}
Run Code Online (Sandbox Code Playgroud)
问题是,它真的是一个黑客,所以我想知道是否还有其他更优雅的方式我可以做同样的事情?
我的项目包含XMPPFramework,其中包含必须与ARC一起使用的文件.但是我的项目是Non ARC,由于链接到它的某些其他库而无法转换.
如何强制编译器仅在某个类上使用ARC?
我知道iOS自动引用计数,它是基于编译器的功能.但是,我一直在浏览许多网站,并对iOS程序开发中是否存在垃圾收集感到困惑?我知道,ARC和GC彼此不同.一些链接说,GC可用于iOS,有些链接表示GC仅适用于Mac OS X开发.但是,我无法断定在iOS开发中是否存在GC?请指导我正确的路径或链接,以便我能理解它并尝试编程.
谢谢!
我们是否必须removeObserver:明确发送已作为观察者添加到NSNotificationCenter之前的对象?
我有点困惑,无法找到确切的答案.
请详细提供我,包括为什么我们需要显式删除Observer,以及为什么编译器没有隐式地将它放在类/应用程序中?
cocoa objective-c nsnotificationcenter automatic-ref-counting