要解析URL的部分查询字符串,我使用此方法:
NSScanner *scanner = [[NSScanner alloc] initWithString:query];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
NSString *parameterString = [NSString new];
while ([scanner scanUpToString:ampersand intoString:¶meterString])
{
NSScanner *parameterScanner = [[NSScanner alloc] initWithString:parameterString];
NSString *name = [NSString new];
[parameterScanner scanUpToString:isEqual intoString:&name];
NSString *value = [parameterString substringFromIndex:([name length] + 1)];
[parameters setObject:value forKey:name];
}
Run Code Online (Sandbox Code Playgroud)
在这个项目中我使用的是ARC,但是这个方法仍在泄漏:
[parameterScanner scanUpToString:isEqual intoString:&name];
Run Code Online (Sandbox Code Playgroud)
究竟是什么泄漏,我该如何解决?
在使用迁移工具将我的应用程序迁移到ARC并解决所有待处理问题后,在分配工具中进行的快速测试显示,我在应用程序中执行的任何操作都会泄漏内存.
这是一个非常大的应用程序,迁移需要2个小时才能完成(包括检查我所做的每一个更改 - 所有这些都看起来很好!)
我检查了所有编译器标志两次,以确保为每个文件和项目级别实际启用ARC.
以前迁移到ARC我的应用程序完全没问题.通过多次重复相同的操作来获取Heapshot时,绝对没有堆增长.这是100%无泄漏,没有遗弃的记忆.它是完美的.现在这是一个巨大的泄漏事情,如果没有明天.
知道发生了什么事吗?
xcode memory-management objective-c ios automatic-ref-counting
何时发布了发布方法?当我完成它时,我总是释放内存分配,现在看来该方法已被弃用.或者它可能不适用于某些对象?
无论如何,这就是我做的:
Customer *aCustomer = [[Customer alloc] init];
...
[aCustomer release];
Run Code Online (Sandbox Code Playgroud)
我在那里得到一个错误...任何人都在意解释为什么我发现错误,因为我释放了我的记忆?错误消息是:
'release'in unavailable:在自动引用计数模式下不可用ARC禁止显式消息发送'release'
转换到ARC时,我收到以下编译器错误:"删除未使用的自动释放消息是不安全的".
如果我只是删除自动释放消息,obj将立即在getAutoreleasedObj结束时释放,这将导致printObj崩溃.那么如何处理自动释放的对象,并将以下代码转换为ARC?
- (MyClass *) getAutoreleasedObj {
MyClass *obj = [[MyClass alloc] init];
[obj autorelease];
return obj;
}
- (void) printObj {
NSLog(@"%@", [self getAutoreleasedObj];
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个NSURL并将它传递给一个选择器,然后将它传递给另一个选择器,等等.当它到达它的位置时,它记录得很好,但在使用它时给出一个sigabort.我怀疑这意味着我的对象已被ARC释放.我怎样才能确保它能够长时间保持使用?
__strong NSURL *url = [[NSURL alloc] initWithString:str];
... passes to a selector
... passes to another
... and then to fetchVideoContent
- (void)fetchVideoContent:(NSURL *)url withGUID:(NSString *)guid;
{
NSMutableURLRequest *req;
req = [NSMutableURLRequest requestWithURL:url // <-- DIES ON THIS LINE (SIGABRT)
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
...
Run Code Online (Sandbox Code Playgroud)
这是我能想到的"最强"的东西,但仍然无效.有什么建议?
我正在尝试修改一些使用NSZoneMalloc的旧代码.我正在使用它的项目启用了ARC,不允许使用NSZoneMalloc.
令人讨厌的代码行是:
x = NSZoneMalloc([self zone], sizeof(*x));
Run Code Online (Sandbox Code Playgroud)
是否有任何与ARC相同的代码可以使错误消失?说实话,我真的不明白记忆区划.如果这还不够,请告诉我.
提前致谢
我偶然发现了一个我无法在其他地方找到答案的问题.当我调用一个方法返回指向稍后使用的对象的指针并且在结尾设置为nil时,它仍然在内存中分配(根据Instruments).我正在使用XCode 4.6.3和iOS 6.1.ARC已开启.
这是示例代码:
ClassA.h
@interface ClassA : NSObject
-(void)runSomething;
@end
Run Code Online (Sandbox Code Playgroud)
ClassA.m
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA
-(void)runSomething {
int counter = 0;
while (true) {
ClassB *instance = [self makeClassBWithNumber:counter];
NSLog(@"%d", [instance getNumber]);
[NSThread sleepForTimeInterval:0.01];
instance = nil;
counter++;
}
}
-(ClassB*) makeClassBWithNumber:(int)number {
return [[ClassB alloc] initWithNumber:number];
}
@end
Run Code Online (Sandbox Code Playgroud)
ClassB.h
@interface ClassB : NSObject
@property int number;
-(id)initWithNumber:(int)number;
-(int)getNumber;
@end
Run Code Online (Sandbox Code Playgroud)
ClassB.m
#import "ClassB.h"
@implementation ClassB
-(id)initWithNumber:(int)number {
self = [super init];
if(self) {
_number = number;
} …Run Code Online (Sandbox Code Playgroud) 在5之前的Xcode版本中,我们可以在创建项目时在项目设置中禁用ARC.现在ARC给我带来了这个问题.
使用属性列表文件,对于读取步骤,编译器给出了一个错误:"ARC不允许将'int'隐式转换为'id'".我没有与Xcode 4相同的代码有这个问题.在我的属性列表文件中,键是数字,也在我的viewController.m中当我禁止ARC作为目标时,警告仍然存在.
我看不出如何添加编译器标志.代码(带法语字符串):
NSString *error;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"Save.plist"];
NSArray *keys = [NSArray arrayWithObjects:@"valeurCompteur1", @"valeurCompteur2", @"valeurCompteur3", @"valeurCompteur4", @"valeurCompteur5", @"nomCompteur1", @"nomCompteur2", @"nomCompteur3", @"nomCompteur4", @"nomCompteur5", nil];
NSArray *objs = [NSArray arrayWithObjects: compteur1, compteur2, compteur3, compteur4, compteur5, nameC1, nameC2, nameC3, nameC4, nameC5, nil];
Run Code Online (Sandbox Code Playgroud) 我想尝试手动内存管理,因为我喜欢看[NSObject release]即使我没有真正发布它,如果我打电话会发生什么.我不想摆脱ARC或任何东西,我只是想试验.我已经尝试在创建项目时取消选中该复选框,但它没有显示出来.它是某种构建选项吗?我试图查看构建选项,但我找不到它.ARC现在是强制性的吗?
假设我有一个定义为的属性@property (copy) NSString *name。
假设我有init如下定义的方法。
-(instancetype) initWithName:(NSString *)name
{
self = [super init];
if (self)
{
_name = [name copy]; //Do I need this copy or will ARC do it automatically?
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我是否需要注释行中的副本,或者ARC将copy像在综合设置器中一样,根据属性声明中的进行处理?