我想知道bool在启用ARC时为原始数据类型(如)编写合成属性的正确方法是什么.
我曾经在ARC之前使用它:
@property(assign) bool isOn;
Run Code Online (Sandbox Code Playgroud)
但是我的理解(也许是错误的)你不应该assign在启用ARC时使用它.我试着替换它weak但我得到错误 -
"weak"属性的属性必须是object类型.
我应该继续使用assign吗?
memory-management properties objective-c automatic-ref-counting
我想在一个对象中存储一个归零的弱引用NSDictionary.这是为了引用父项NSDictionary,因此我可以在不进行搜索的情况下爬回大型结构.
我不能__weak在这里使用; 即使我的本地引用很弱,它NSDictionary也会存储对弱引用对象的强引用.而且,当然,NSDictionary不能有nil对象.
我在iOS上,而不是Mac,因此NSHashTable无法使用.我只希望一个物体变弱; 其余的应该仍然很强大.
(我将发布我的答案,所以如果没有更好的答案,我有一些标记为可接受.但我希望有人有更好的答案.)
是否有编译器选项(或其他方式)来查看ARC插入保留和释放的位置?这主要是出于好奇.我可以在反汇编代码中看到它们,但有时候很难通过.
我声明了一个属性来引用GCD队列:
@property (assign) dispatch_queue_t backgroundQueue;
Run Code Online (Sandbox Code Playgroud)
在类的init方法中,我创建了一个串行队列:
backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)
ARC抱怨:"将保留对象分配给unsafe_unretained变量;对象将在分配后释放"
我必须使用__bridge_transfer吗?
在-dealloc我发布队列:
dispatch_release(backgroundQueue);
Run Code Online (Sandbox Code Playgroud)
ARC再次提出抱怨:"ARC禁止发布'发布'的明确消息"
我发现这令人困惑,因为这是一个C函数调用,思想队列是C对象,我必须自己处理内存管理!从什么时候开始为我处理C-objects?
memory-management grand-central-dispatch ios automatic-ref-counting
我需要阻止.但编译器会发出警告
"在这个区块强势捕捉'自我'可能会导致保留周期"
__weak typeof(self) weakSelf = self;
[generalInstaImage setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:data[@"images"][@"low_resolution"][@"url"]]] placeholderImage:[UIImage imageNamed:@"Default"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
NSLog(@"success");
[generalInstaImage setImage: image];
[weakSelf saveImage:generalInstaImage.image withName:data[@"id"]];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"fail");
}];
Run Code Online (Sandbox Code Playgroud)
我尝试编写类似的例子weakSelf.generalInstaImage,但编译器生成错误而不编译.
objective-c ios objective-c-blocks automatic-ref-counting retain-cycle
我有一个类从URL检索JSON并通过协议/委托模式返回数据.
MRDelegateClass.h
#import <Foundation/Foundation.h>
@protocol MRDelegateClassProtocol
@optional
- (void)dataRetrieved:(NSDictionary *)json;
- (void)dataFailed:(NSError *)error;
@end
@interface MRDelegateClass : NSObject
@property (strong) id <MRDelegateClassProtocol> delegate;
- (void)getJSONData;
@end
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用strong我的委托属性.以后更多关于......
我正在尝试编写一个"包装"类,它以基于块的格式实现getJSONData.
MRBlockWrapperClassForDelegate.h
#import <Foundation/Foundation.h>
typedef void(^SuccessBlock)(NSDictionary *json);
typedef void(^ErrorBlock)(NSError *error);
@interface MRBlockWrapperClassForDelegate : NSObject
+ (void)getJSONWithSuccess:(SuccessBlock)success orError:(ErrorBlock)error;
@end
Run Code Online (Sandbox Code Playgroud)
MRBlockWrapperClassForDelegate.m
#import "MRBlockWrapperClassForDelegate.h"
#import "MRDelegateClass.h"
@interface DelegateBlock:NSObject <MRDelegateClassProtocol>
@property (nonatomic, copy) SuccessBlock successBlock;
@property (nonatomic, copy) ErrorBlock errorBlock;
@end
@implementation DelegateBlock
- (id)initWithSuccessBlock:(SuccessBlock)aSuccessBlock andErrorBlock:(ErrorBlock)aErrorBlock {
self = [super init];
if (self) {
_successBlock …Run Code Online (Sandbox Code Playgroud) delegates memory-management objective-c objective-c-blocks automatic-ref-counting
我在ARC引用计数方面有点混乱你可以告诉我下面的波纹管代码的参考数量.
var vc1 = UIViewController()
var vc2 = vc1
var vc3 = vc2
weak var vc4 = vc3
Run Code Online (Sandbox Code Playgroud)
问题是:
我已将我的应用转换为使用ARC.
在我有以下代码行之前:
NSArray *colors = [NSArray arrayWithObjects:startColor, endColor, nil];
Run Code Online (Sandbox Code Playgroud)
由于ARC不允许将非Objective-C指针类型隐式转换为'id',所以我重写了这样的行:
NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];
Run Code Online (Sandbox Code Playgroud)
一切都在模拟器上正常工作,但是在设备上,应用程序在提到的行上崩溃并显示错误消息:
-[Not A Type retain]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决?
当我从C++(和小Java)转移到Objective C(iOS)时,我很难理解iOS中的内存管理.但现在这一切看起来很自然,我知道保留,自动释放,复制和发布的东西.在阅读了ARC之后,我想知道使用ARC有什么好处,或者只是你不必担心内存管理.在转向ARC之前,我想知道如何转向ARC.
我只是想知道是否可以将非ARC项目转换为ARC而不重新创建它?谢谢
ios ×7
objective-c ×5
ios5 ×2
delegates ×1
memory ×1
nsdictionary ×1
properties ×1
retain-cycle ×1
swift ×1