标签: automatic-ref-counting

如何使用具有自动引用计数的委托

我加入了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调用中?

任何有关这方面的帮助将非常感谢.

iphone ios ios5 automatic-ref-counting

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

在ARC中归零弱引用

如果我读到Mike Ash的"归零弱引用"文章是正确的,那么弱引用就像assign没有ARC的引用一样.但是,如果引用的对象被释放,而不是获得"悬空指针"(意味着指向解除分配的对象的指针),则指针将设置为nil.

这是正确的吗,这是否会在标记的任何财产weakassign(当ARC处于活动状态时)发生?

如果这是正确的,这将消除很多SIGABRT.

objective-c clang automatic-ref-counting

44
推荐指数
1
解决办法
1万
查看次数

正确桥接ARC?

我有一个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)

objective-c automatic-ref-counting

43
推荐指数
2
解决办法
2万
查看次数

使用ARC的优点和缺点是什么?

在iOS项目中使用新的自动引用计数(ARC)内存管理方式有哪些优缺点?

使用iOS 5.0 SDK进行开发时,您可以选择不使用ARC吗?

您是否为新项目推荐ARC或手动引用计数(MRC)?

使用ARC的应用程序是否能够在比iOS 5.0更旧的操作系统版本上运行?

iphone reference-counting ios ios5 automatic-ref-counting

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

是否需要ARC中的NSNotificationCenter removeObserver?

添加观察者是否会增加对象的保留计数?如果是,ARC是否也会处理此观察者的移除?如果没有,我应该在哪里删除观察者?

iphone cocoa-touch objective-c ios automatic-ref-counting

42
推荐指数
1
解决办法
1万
查看次数

使用ARC,有什么更好的:alloc或autorelease初始化器?

使用allocautorelease初始化器更好(更快,更高效).例如:

- (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

41
推荐指数
2
解决办法
7323
查看次数

处理ARC中的指针到指针所有权问题

假设对象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 automatic-ref-counting

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

将Objective-C指针类型'NSString*'转换为C指针类型'CFStringRef'(又名'const struct __CFString*')需要桥接转换

将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)

什么是桥接演员?

错误的屏幕截图

casting objective-c automatic-ref-counting

40
推荐指数
3
解决办法
4万
查看次数

ARC的@property定义:现在是强默认吗?

只需在新的xcode 4.3.1上运行ARC重构工具,并注意到我的(非原子,保留)属性正在换出(非原子)而不是(非原子,强),就像在前面的xcode中一样.

我的代码似乎在这次更改后运行正常,所以我假设它默认为强大,任何人都知道为什么ARC转换器的情况发生了变化?

xcode ios automatic-ref-counting

40
推荐指数
1
解决办法
1万
查看次数

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

40
推荐指数
3
解决办法
1万
查看次数