我加入了ARC的行列.在过去,我会将我的委托属性声明为:
@property(assign) id<MyProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)
所以我想我会在ARC下做到这一点:
@property(weak) id<MyProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)
不是这样.在.m中的@synthesize语句我有一个编译错误:
*语义问题:__ weak属性'委托'的现有ivar'委托'必须是__weak*
我已经声明它虽然很弱!另外,我如何将实现协议的类传递给弱引用的属性.我是否必须将其包装在其中一个奇怪的obj_unretained调用中?
任何有关这方面的帮助将非常感谢.
如果我读到Mike Ash的"归零弱引用"文章是正确的,那么弱引用就像assign没有ARC的引用一样.但是,如果引用的对象被释放,而不是获得"悬空指针"(意味着指向解除分配的对象的指针),则指针将设置为nil.
这是正确的吗,这是否会在标记的任何财产weak或assign(当ARC处于活动状态时)发生?
如果这是正确的,这将消除很多SIGABRT.
我有一个NSString的类别类.
@implementation NSString (URLEncode)
- (NSString *)URLEncodedString
{
__autoreleasing NSString *encodedString;
NSString *originalString = (NSString *)self;
encodedString = (__bridge_transfer NSString * )
CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)originalString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return encodedString;
}
Run Code Online (Sandbox Code Playgroud)
我是否使用ARC和新LLVM的正确桥接传输?
原始代码:
- (NSString *)URLEncodedString
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return [encodedString autorelease];
}
Run Code Online (Sandbox Code Playgroud) 在iOS项目中使用新的自动引用计数(ARC)内存管理方式有哪些优缺点?
使用iOS 5.0 SDK进行开发时,您可以选择不使用ARC吗?
您是否为新项目推荐ARC或手动引用计数(MRC)?
使用ARC的应用程序是否能够在比iOS 5.0更旧的操作系统版本上运行?
添加观察者是否会增加对象的保留计数?如果是,ARC是否也会处理此观察者的移除?如果没有,我应该在哪里删除观察者?
使用alloc或autorelease初始化器更好(更快,更高效).例如:
- (NSString *)hello:(NSString *)name {
return [[NSString alloc] initWithFormat:@"Hello, %@", name];
}
Run Code Online (Sandbox Code Playgroud)
要么
- (NSString *)hello:(NSString *)name {
return [NSString stringWithFormat:@"Hello, %@", name];
// return [@"Hello, " stringByAppendingString:name]; // even simpler
}
Run Code Online (Sandbox Code Playgroud)
我知道在大多数情况下,这里的表现无关紧要.但是,我仍然希望养成以更好的方式做这件事的习惯.
如果他们做同样的事情,那么我更喜欢后一种选择,因为它的输入更短,更具可读性.
在Xcode 4.2,有没有办法,看看有什么ARC编译成,也就是说,它把retain,release,autorelease,等?切换到ARC时,此功能非常有用.我知道你不应该考虑这些东西,但它能帮助我弄清楚这些问题的答案.
cocoa cocoa-touch memory-management objective-c automatic-ref-counting
假设对象A有一个属性:
@property (nonatomic, strong) Foo * bar;
Run Code Online (Sandbox Code Playgroud)
在实现中合成为:
@synthesize bar = _bar;
Run Code Online (Sandbox Code Playgroud)
对象B操纵a Foo **,如本示例中对象A的调用:
Foo * temp = self.bar;
[objB doSomething:&temp];
self.bar = temp;
Run Code Online (Sandbox Code Playgroud)
doSomething:方法的正确声明是什么?此外,假设在我有机会设置属性之前可以释放对象Bbar(从而获取指向的实例的所有权temp) - 我如何告诉ARC切换拥有的引用?换句话说,如果我想让以下示例代码段起作用,我将如何处理ARC问题?
Foo * temp = self.bar; // Give it a reference to some current value
[objB doSomething:&temp]; // Let it modify the reference
self.bar = nil; // Basically release whatever we have
_bar = temp; // Since we're …Run Code Online (Sandbox Code Playgroud) 将Objective-C程序转换为Objective-C ARC时,我收到错误:
"cast of Objective-C pointer type 'NSString *' to C pointer type 'CFStringRef' (aka 'const struct __CFString *') requires a bridged cast "
Run Code Online (Sandbox Code Playgroud)
代码如下:
- (NSString *)_encodeString:(NSString *)string
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)string, // this is line in error
NULL,
(CFStringRef)@";/?:@&=$+{}<>,",
kCFStringEncodingUTF8);
return [result autorelease];
}
Run Code Online (Sandbox Code Playgroud)
什么是桥接演员?

只需在新的xcode 4.3.1上运行ARC重构工具,并注意到我的(非原子,保留)属性正在换出(非原子)而不是(非原子,强),就像在前面的xcode中一样.
我的代码似乎在这次更改后运行正常,所以我假设它默认为强大,任何人都知道为什么ARC转换器的情况发生了变化?
如何在ARC下获得一系列归零弱引用?我不希望数组保留对象.我希望数组元素在被释放时自行删除,或者将这些条目设置为nil.
同样,我怎么能用字典做到这一点?我不希望字典保留值.再次,我希望字典元素要么在取消分配值时删除自己,要么将值设置为nil.(我需要保留密钥,这是唯一的标识符,至少在相应的值被释放之前.)
这两个问题涉及类似的问题:
但两者都没有要求归零.
根据文档,NSPointerArray和NSHashMap都不支持ARC下的弱引用.NSValue的nonretainedObjectValue也不起作用,因为它是非归零的.
我看到的唯一解决方案是创建我自己的类似NSValue的包装类,其中包含一个(weak)属性,正如这个答案提到的那样,接近结尾.有没有更好的方式我没有看到?
我正在为OS X 10.7和iOS 6.0开发.
cocoa cocoa-touch weak-references objective-c automatic-ref-counting