Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题!
我已经使用了块和ARC,并且在某些情况下发现,iOS仅在Release版本中崩溃.编写代码是错误的方法,就像这样.
-(IBAction)clickedButtonA:(UIBarButtonItem*)sender event:(UIEvent*)event {
NSMutableArray *arrRows = [NSMutableArray arrayWithCapacity:0];
#warning this code only crash on Release Build.... Don't use this
NSMutableDictionary * dicRow = [NSMutableDictionary dictionaryWithCapacity:0];
[arrRows addObject:dicRow];
dispatch_block_t block = ^{
NSString *str = [NSString stringWithFormat:@"%@",[_tweet valueForKey:@"text"]];
[[UIPasteboard generalPasteboard] setString:str];
};
[dicRow setValue:block forKey:kDicKeyLinkPopBlock];
NSMutableArray *sections = [NSMutableArray arrayWithObject:arrRows];
TOVLinkPopoverViewController *controller= [[TOVLinkPopoverViewController alloc] init];
controller.arrayLink = sections;
}
Run Code Online (Sandbox Code Playgroud)
从其他控制器,当我访问该块时,它崩溃只有我在发布版本.我知道你需要复制块
[dicRow setValue:[block copy] forKey:kDicKeyLinkPopBlock];
Run Code Online (Sandbox Code Playgroud)
对于非块感知类,如NSMutableDictionary.
问题是"为什么它只会在发布版本上崩溃?" 我知道这应该"崩溃",这是使用块的错误方法,但希望它在Debug构建时崩溃,所以我们可以更早地找到这种bug.
还有一个问题是"是否存在任何使用调试版本使代码崩溃的构建设置?"
您可以从gitHub运行示例代码, https://github.com/tomohisa/iOS_PopoverMenu_Notification
请参阅ViewController.m并查找已注释掉的代码(仅在发布时崩溃).
我试图使用一个不使用的框架,ARC似乎我必须关闭此功能才能使用它.我的问题是,这样做的潜在后果是什么?如果我关闭它,我将对当前的代码做什么以确保我没有任何内存泄漏或一般的任何其他问题?
没有ARC,我可以使用自动释放数组,如下所示
//-(NSMutableArray *)getObjects
-(NSMutableArray *)retrieveObjects
{
NSMutableArray *aArray = [[NSMutableArray alloc] init];
// add objects
return [aArray autorelease];
}
Run Code Online (Sandbox Code Playgroud)
如何在ARC中实现同样的目标?
我正在上课(在Lynda.com上进行基于计算机的培训),教师继续讲述如何使用"发布"来处理对象.本课程创建于2011年,显然Apple已更新其产品,以便自动为您完成发布.虽然我知道我可以回到手动模式并自行发布项目(例如关闭ARC),我的问题是:最佳做法是什么?我应该打开ARC还是关掉它?也许你有一个很好的例子,我应该何时做出这个选择?
此外,如果我完全不在此基础上,您的帮助也会受到赞赏:-)
谢谢.
我在ARC下的内存管理方面遇到了一些问题.当我在我的应用程序中使用popViewController时,它们都没有释放内存,有时候不会调用viewcontroller的dealloc.即使在调用dealloc时,内存仍然没有被释放.所以我问什么会占用内存甚至viewController的dealloc方法被调用?什么会导致dealloc不被称为?很少有动画,代表?还要别的吗?
memory-management objective-c dealloc ios automatic-ref-counting
请参阅以下代码示例(ARC模式),SKProductsRequest如何保留自己以等待响应?我的意思是在ARC模式下你不能写[self retain],SKProductsRequest如何在start方法中保留self,然后在响应后释放self?如你所知,代表总是很弱.
SKProductsRequest就是这里的一个例子,现在我需要这样一个服务类,并且不知道如何在请求发出时保留自己然后在响应回来时释放自己,任何有想法的人请一起分享和讨论,在此先感谢.
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
productRequest = productsRequest;
productsRequest.delegate = self;
[productsRequest start];
Run Code Online (Sandbox Code Playgroud)
PS:关于objc_setAssociatedObject,需要保持保留关系的外部长实时对象.
objc_setAssociatedObject(externalLiveObj, &kRetainSelfKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
Run Code Online (Sandbox Code Playgroud) 在ios中,主要的自动释放池包含UIApplicationMain.如果我没有在应用程序内部手动设置其他自动释放池,这是否意味着每当我使用自动释放在应用程序中释放对象时,在UIApplicationMain完成,池被耗尽,应用程序终止之前,它实际上不会被释放?
这似乎是这种情况,如果是这样,使用自动释放似乎是一个非常糟糕的主意.所有对象,即使只是为了临时原因而创建,也会一直存在,直到应用程序结束,从而消耗大量内存.
例如,我认为许多工厂方法都使用自动释放.使用工厂方法创建的所有内容是否仅在应用程序完成时释放?
我知道ARC和MRC的工作原理。但是在测试以下代码时我感到困惑。我不知道为什么会这样。为什么对于相同的问题,在调试模式和运行模式下保留计数不同?
NSMutableArray *a = [NSMutableArray array];
[a addObject:@"abc"];
NSLog(@" 1 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
__weak NSMutableArray *b = a;
NSLog(@" 2 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
a = nil;
NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
[b addObject:@"xys"];
NSLog(@" 4 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
Run Code Online (Sandbox Code Playgroud)
当我在运行模式下运行应用程序时,NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));由于b是a的weak引用,因此我认为该应用程序崩溃。并在分配nil给对象时反对获取释放。但在此之前,如果将前两行的输出显示为下图。这也是正确的。
但是,当应用程序处于调试模式(意味着我们已设置断点和调试)时,该应用程序不会崩溃,并且每行还显示保留计数2。如下图所示。
有谁知道为什么会这样吗?为什么相同的代码为不同的模式赋予两个不同的保留值?
memory-management llvm-gcc ios automatic-ref-counting retain-cycle
我搜索了许多链接并阅读了很多文章,但我找不到确切的区别retain和assign..
我正在尝试以下方法:
NSMutableArray *arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSMutableArray *arr2=[arr1 retain];
NSMutableArray *arr3 = arr1; //Assign
[arr1 addObject:@"66"];
NSLog(@"Array one : %@",arr1);
NSLog(@"Array two : %@",arr2);
NSLog(@"Array three : %@",arr3);
Run Code Online (Sandbox Code Playgroud)
输出:
Array one : (
1,
2,
3,
66
)
Array two : (
1,
2,
3,
66
)
Array three : (
1,
2,
3,
66
)
Run Code Online (Sandbox Code Playgroud)
以上示例给出了相同的输出.
考虑到上面的例子,我如何定义assign和之间的区别retain?
如果以上示例有错,请提供更好的示例提供答案.
memory-management reference-counting objective-c ios automatic-ref-counting
ios ×9
objective-c ×6
asynchronous ×1
autorelease ×1
cocoa ×1
cocoa-touch ×1
dealloc ×1
iphone ×1
llvm-gcc ×1
retain ×1
retain-cycle ×1