我有一个保留/释放问题.我的视图非常复杂,所以我将NSZombieEnabled设置为YES,并试图确定哪个对象导致我悲痛.为了加快这个过程,我想知道是否有跟踪僵尸回到坟墓的暗示或技巧,他们挖出了自己的方式(对不起,不得不)或者,回到他们关联的对象?神秘的控制台消息似乎没有提供太多的见解:
NSInvocation: warning: object 0x1076850 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead
Run Code Online (Sandbox Code Playgroud)
我没有被称为"前方麻烦"的选择者.
编辑 - 包括堆栈跟踪:
#0 0x3026e017 in ___forwarding___
#1 0x3024a0a2 in __forwarding_prep_0___
#2 0x302042e8 in CFRelease
#3 0x00c4fc31 in CALayerUpdateSublayers
#4 0x00c4e173 in -[CALayer dealloc]
#5 0x00c4000e in CALayerRelease
#6 0x00c48dad in CALayerFreeTransaction
#7 0x00c410b8 in CA::Transaction::commit
#8 0x00c492e0 in CA::Transaction::observer_callback
#9 0x30245c32 in __CFRunLoopDoObservers
#10 0x3024503f in CFRunLoopRunSpecific
#11 0x30244628 in CFRunLoopRunInMode
#12 0x32044c31 in GSEventRunModal
#13 0x32044cf6 in GSEventRun
#14 0x309021ee in UIApplicationMain …Run Code Online (Sandbox Code Playgroud) 我使用以下代码将对象传递给辅助线程:
(void)login:(id)sender
{
platformMsgs_LoginRequest *loginRequest = [[[platformMsgs_LoginRequest alloc] init] autorelease];
//more code...
[NSThread detachNewThreadSelector:@selector(sendLoginRequest:) toTarget:self withObject:loginRequest];
//more code...
}
- (void)sendLoginRequest:(platformMsgs_LoginRequest *)loginRequest
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[loginRequest retain];
NetSuiteBinding *binding = [NetSuiteServiceSvc NetSuiteBinding];
NetSuiteBindingResponse *response = [binding loginUsingParameters:loginRequest applicationInfo:nil partnerInfo:nil];
[self performSelectorOnMainThread:@selector(loginOperationCompleted:) withObject:response waitUntilDone:NO];
[loginRequest release];
[pool drain];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,自动释放正确的方法来处理这个对象的释放吗?一旦它传递给辅助线程,我保留它并在我不再需要它时释放它.
但是,自动释放可能会在辅助线程有机会保留它之前释放对象吗?我是否必须为此创建一个ivar?以便我可以在performSelectorOnMainThread中释放该对象?登录后我不再需要该对象,因此ivar似乎不是正确的方法.处理这个问题的最佳方法是什么?谢谢.
-Oscar
我的代码越多,我就越迷失...所以我决定为我(以及其他人)创建一个完全专注于内存管理的主题,不要浪费时间理解obj-c基础...我会将其更新为问了新问题!
以下是一些例子:
// myArray is property (retain)
myArray = otherArray;
//myArray isn't a property
myArray = otherArray;
//myArray is a property (retain)
myArray = [[NSArray alloc] init];
//myArray isn't a property
myArray = [[NSArray alloc] init];
Run Code Online (Sandbox Code Playgroud)
---所以,如果我明白了......当你把self.myArray放到Xcode上时,你告诉Xcode使用getter或setter,但是当你做myArray时,你对一切负责,对吧?
[求助] UPDATE1:之间是否有区别:
//myArray is a property
myArray = otherArray; // it is only a reference, releasing otherArray will imply releasing myArray
self.myArray = otherArray; // otherArray is sent a retain message so releasing otherArray will still keep myArray in memory
Run Code Online (Sandbox Code Playgroud)
---是的,有区别(见上面的评论)
[已解决] …
我对iPhone开发相对较新,所以这可能是我的错,但这与我所看到的情况相悖.:)
我认为我正在创建一个UIAlertView,它只存在于'if'语句中.
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if(!data)
{
// Add an alert
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Unable to contact server"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
NSLog(@"retain count before show: %i", alert.retainCount);
[alert show];
NSLog(@"retain count before release: %i", alert.retainCount);
[alert release];
NSLog(@"retain count after release: %i", alert.retainCount);
return nil;
}
Run Code Online (Sandbox Code Playgroud)
但是,控制台日志让我感到困惑.
retain count before show: 1
retain count before release: 6
retain count after release: 5
Run Code Online (Sandbox Code Playgroud)
我也尝试过添加:
alert = nil;
Run Code Online (Sandbox Code Playgroud)
发布后.这使保留计数为0,但我仍然显示泄漏.如果有帮助,泄漏的负责框架是UIKeyboardInputManagerClassForInputMode.我也在使用OS 4 Beta 3.
所以任何人都有任何想法,当调用-show时,本地UIAlertView的保留计数将如何增加5?
谢谢你的帮助!
我在标题中有以下内容:
@property (nonatomic, retain) UIView *overlay;
Run Code Online (Sandbox Code Playgroud)
并在实施中:
@synthesize overlay;
Run Code Online (Sandbox Code Playgroud)
然后:
UIView *tempOverlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
self.overlay = tempOverlay;
[tempOverlay release];
Run Code Online (Sandbox Code Playgroud)
tempOverlay上面的变量不是不必要的吗?我不能这样做:
self.overlay = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 70.0f, 150.0f, 310.0f)];
Run Code Online (Sandbox Code Playgroud) 我试图了解ARC的工作方式,据我所知,我应该在这里做错事.这是我正在使用的代码:
接口:
@interface ViewController : UIViewController{
}
@property (strong, nonatomic) NSString * myString ;
@property (weak, nonatomic) NSString * myPointer ;
Run Code Online (Sandbox Code Playgroud)
执行:
- (void)viewDidLoad{
[super viewDidLoad];
self.myString = @"Hello world!" ; // myString is strong
self.myPointer = self.myString ; // myPointer var is weak
[self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];
[self performSelector:@selector(printValues) withObject:nil afterDelay:2];
}
- (void) makeNilMyValue{
self.myString = nil ;
}
- (void) printValues{
NSLog(@"myString: %@", self.myString) ;
NSLog(@"myPointer: %@", self.myPointer) ;
}
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我得到:
2012-02-26 11:40:41.652 test1[933:207] myString: (null)
2012-02-26 …Run Code Online (Sandbox Code Playgroud) 如何通过像Rotation这样的onCreate/Destroy循环来最好地保留Fragment中的数据?
在我们的设置中,我们有可能从我们的服务器加载到片段自定义列表适配器中的大型列表,我们希望通过不使它们在轮换时重新加载来平滑UX.我们设置片段的问题retainInstance = true; 是我们的适配器具有对原始活动的上下文的引用,因此会泄漏内存.我们可以只将数据存储在片段中并重新创建适配器; 如果那样真的是正确的做法吗?
下一个想法是将数据存储到会话单例对象中并在轮换后检索,这会产生一些陈旧数据的问题但我们可以轻松克服.
我看到的另一种选择,似乎是最好的解决方案,是将数据保存到一个包中并在旋转后恢复到新的片段; 但是,我们有很多对象需要存储在整个应用程序中,而且我们的一些对象很复杂,包含列表,多种类型,并且可能会让人感到痛苦.是否有更好的解决方案,还是我们必须咬紧牙关让它们成为Parcelable?
假设我有一个简单的调用dispatch_async(self.queue, ^{ /* Empty */ }),其中self.queue是先前创建的队列.
并self获得由块在这种情况下保留,因为没有self参考里面的块,但只作为一个参数dispatch_async()?
reference-counting retain grand-central-dispatch objective-c-blocks
给出以下代码
@interface MyClass
{
SomeObject* o;
}
@property (nonatomic, retain) SomeObject* o;
@implementation MyClass
@synthesize o;
- (id)initWithSomeObject:(SomeObject*)s
{
if (self = [super init])
{
o = [s retain]; // WHAT DOES THIS DO? Double retain??
}
return self
}
@end
Run Code Online (Sandbox Code Playgroud) NSManagedObject提供访问它NSManagedObjectContext,但它保留它吗?
根据Marcus Zarra的 " 在iOS上传递NSManagedObjectContext"," 内部NSManagedObject保留了对它的引用NSManagedObjectContext,我们可以访问它."
Zarra如何知道这一点并且他是否正确?
我问,因为我想知道是否NSManagedObjectContext会dealloc在tearDown下面的方法中编辑.(我正在使用CocoaPlant.)
#import <SenTestingKit/SenTestingKit.h>
#import <CocoaPlant/CocoaPlant.h>
#import "AccountUser.h"
@interface AccountUserTests : SenTestCase {
AccountUser *accountUser;
}
@end
@implementation AccountUserTests
- (void)setUp {
accountUser = [AccountUser insertIntoManagedObjectContext:
[NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType error:NULL]];
}
- (void)tearDown {
[accountUser delete];
}
- (void)testFetchWithLinkedAccountUserID {
// Tests go here...
}
@end
Run Code Online (Sandbox Code Playgroud) retain ×10
iphone ×6
objective-c ×2
allocation ×1
android ×1
arguments ×1
cocoa ×1
cocoa-touch ×1
core-data ×1
debugging ×1
equals ×1
memory-leaks ×1
nsarray ×1
nsthread ×1
parcelable ×1
properties ×1
rotation ×1
uialertview ×1
variables ×1
weak ×1